- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
JobStore 负责跟踪您给调度器的所有“工作数据”:作业、触发器、日历等等。为您的Quartz scheduler实例选择合适的JobStore是一个重要步骤。幸运的是,一旦你理解了它们之间的区别,选择应该是非常简单的。您在属性文件(或对象)中声明您的调度器应该使用哪个 JobStore (以及它的配置设置),您可以使用它来生成调度程序实例。
不要直接在代码中使用JobStore实例。
出于某种原因,许多人试图这样做。JobStore是用于Quartz本身的幕后使用。您必须告诉Quartz(通过配置)使用哪个JobStore,但是您应该只在代码中使用调度器接口。
RAMJobStore 是最简单的使用的 JobStore,它也是性能最好的(在CPU时间方面)。
RAMJobStore以一种显而易见的方式获得它的名称: 它将所有数据保存在RAM中。这就是为什么它是闪电般的快速,以及为什么它如此简单的配置。
缺点是当您的应用程序结束(或崩溃)时所有的调度信息丢失——这意味着 RAMJobStore 不能对作业和触发器的“非波动”设置表示支持。
对于某些应用程序,这是可以接受的,甚至是期望的行为,但对于其他应用程序,这可能是灾难性的。
要使用 RAMJobStore(并假设您使用的是 StdSchedulerFactory
),只需指定类名称 org.quartz.simpl。RAMJobStore作为JobStore类属性,用于配置 quartz:
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
JDBCJobStore 也被恰当地命名——它通过JDBC将所有数据保存在一个数据库中。
因此,配置比RAMJobStore要复杂一些,而且也不那么快。但是,性能恢复并不是非常糟糕,特别是如果您在主键上构建了带有索引的数据库表。在相当现代的具有良好LAN(在调度器和数据库之间)的机器上,检索和更新触发触发器的时间通常不超过10毫秒。
JDBCJobStore几乎与任何数据库一起使用,它已经广泛应用于Oracle、PostgreSQL、MySQL、MS SQLServer、HSQLDB和DB2。要使用JDBCJobStore,您必须首先创建一组用于Quartz的数据库表。您可以在Quartz发行版的docs/dbTables目录中找到表创建的SQL脚本。如果没有用于数据库类型的脚本,只需查看现有的数据库类型,并以任何必要的方式修改数据库。需要注意的一点是,在这些脚本中,所有的表都以前缀QRTZ_
”`开头(如表“QRTZ_TRIGGERS”和“QRTZ_JOB_DETAIL”)。这个前缀实际上可以是您想要的任何东西,只要您通知JDBCJobStore前缀是什么(在您的Quartz属性中)。
使用不同的前缀可能有助于在同一个数据库中为多个调度器实例创建多个表集。
一旦创建了表,在配置和激活JDBCJobStore之前,需要做一个更重要的决策。您需要决定应用程序需要哪种类型的事务。如果您不需要将调度命令(例如添加和删除触发器)绑定到其他事务,那么您可以使用JobStoreTX作为JobStore(这是最常见的选择),让Quartz管理事务。
如果您需要Quartz与其他事务一起工作(例如在J2EE应用服务器中),那么您应该使用 JobStoreCMT ——在这种情况下,Quartz 将让应用服务器容器管理事务。
最后一个问题是设置一个数据源,JDBCJobStore可以从该数据源连接到数据库。使用几种不同的方法之一,可以在您的 Quartz 属性中定义数据源。一种方法是让Quartz创建并管理数据源本身——通过提供数据库的所有连接信息。
另一种方法是让Quartz使用一个由Quartz在其内部运行的应用服务器管理的数据源——通过提供JDBCJobStore JNDI名称的数据源。有关属性的详细信息,请参阅“docs/config”文件夹中的示例配置文件。
使用JDBCJobStore(假设你使用StdSchedulerFactory)首先需要设置JobStore类属性的配置为 org.quartz.impl.jdbcjobstore.JobStoreTX
或org.quartz.impl.jdbcjobstore.JobStoreCMT
- 取决于你根据上面几段的解释所做的选择。
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
接下来选择 driver 委托
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.dataSource = myDS
如果您的调度器很忙(即几乎总是执行与线程池大小相同的工作数,那么您应该将数据源中的连接数设置为线程池+2的大小)。
“org.quartz.jobStore。useProperties“配置参数可以设置为“true”(默认为false),以便指示JDBCJobStore, JobDataMaps中的所有值都是字符串,因此可以作为 key-value 对存储,而不是在BLOB列中以序列化形式存储更复杂的对象。
从长远来看,这样做更安全,因为您避免了类版本化问题,而将非string类序列化为BLOB。
TerracottaJobStore 提供了一种无需数据库就可以进行缩放和健壮性的方法。这意味着您的数据库可以避免来自Quartz的负载,并且可以将所有的资源保存到您的应用程序的其他部分。
TerracottaJobStore 可以是集群的或非集群的,在这两种情况下,都为您的工作数据提供了一个存储介质,在应用程序重新启动之间是持久的,因为数据存储在 Terracotta 服务器中。它的性能比通过 JDBCJobStore(大约一个数量级更好) 使用数据库要好得多,但是比RAMJobStore慢得多。
要使用TerracottaJobStore(假设您使用的是 StdSchedulerFactory),只需指定类名称org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore
。作为您用来配置quartz的JobStore类属性,并添加一个额外的配置行来指定Terracotta服务器的位置:
org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore
org.quartz.jobStore.tcConfigUrl = localhost:9510
更多详情,参见 http://www.terracotta.org/quartz
刚接触 Quartz,我对简单形状、渐变和阴影的绘制速度感到好奇;特别将 Quartz 绘图功能与 iPhone 上的 Quartz 图像绘制进行比较。 假设我需要绘制一个填充、描边和阴影的矩形。我假
我遇到了一个问题,即在包含要运行的类文件的应用程序之前部署 quartz-service.xml(使用 quartz 1.8.6 和 JBOSS 5.1.x)。有没有办法延迟 quartz 的启动?
我正在研究使用Quartz Scheduler,并且想知道是否可以按时间而不是按时间调度作业,而可以在另一个作业完成时进行调度。因此,当作业A完成时,它将启 Action 业B。完成后,它将启 Act
我正在使用 Quartz 进行一个项目,并且一直存在与作业的依赖关系的问题。 我们有一个设置,其中 A 和 B 不相互依赖,但 C 是: A 和 B 可以同时运行,但 C 只能在 A 和 B 都完成的
JobDetail.requestsRecovery 的文档属性(property)声明如下 Instructs the Scheduler whether or not the Job should
我得到的调度程序如下: StdScheduler schedulerBean = (StdScheduler) ApplicationContextUtil.getBean(schedulerBean
我正在使用 CronTriggerBean 和 SimpleTriggerBean quartz 调度程序来执行触发器。执行触发器后永久不保存有关触发器的详细信息。在执行之前触发器数据被存储在执行之后
我在我的 .NETCore 服务器中使用 Serilog,并在我的云部署中使用多个接收器,例如控制台、文件和 Graylog (GELF)。 一旦我将日志级别设置为 DEBUG,我每隔几秒钟就会从 q
全部, 我们配置了一个 Quartz.net 调度器。其配置如下: 在分析数据库时,我们注意到以下流量每 23-27 秒执行一次: exec sp_executesql N'SELECT
目前我有一个代码,它有一个 java main 方法,它的执行需要很少的命令行参数。我正在将此作为 quartz 作业,我想将参数传递给这项工作。 有什么办法可以做到吗?我对 JobDataMap 进
我正在使用 Quartz Scheduler,有 15 个工作。对于每项工作,都有一个触发器。 我想为每个触发器设置优先级。我可以将低优先级设置为 10,将高优先级设置为 1。 但是因为我有 15 个
我正在使用 Quartz 框架,对时间生成有点困惑。这是一个简单的代码,它在上午 11:30 生成每日触发器。为了测试这一点,我使用 ComputeFireTimes 查询生成了接下来的 100 个连
我正在使用 Quartz 调度,更具体地说是一个设置为每周每天晚上 10 点醒来的 cron 触发器。 我接触的另一个小组正在询问调度程序在一天中将唤醒多少次以检查它是否需要运行作业。晚上 10 点作
我们有一个托管在 IIS 8.0 上的 Intranet 应用程序。 我们有一些可用的网络方法需要在特定时间执行。 因此,我们使用了 Quartz 调度程序来调度执行 Web 方法的作业。在 glob
我有一个 quartz 作业,每天下午 3 点(服务器时间)运行。我想做的是让它在下午 3 点运行,但针对美国的每个时区。 quartz 作业会触发一封电子邮件给我的用户,我希望每个人都能在他们的时间
我正在尝试在我的 web 项目中使用 Quartz.net。我这样配置我的应用程序: CRMMoreThanOneJob jobGroup1 ReportingPortalBLL.Job
我们有 2 个应用程序使用 quartz 进行调度。我们应用程序的 quartz.properties 如下: org.quartz.scheduler.instanceName = sr22Quar
我有一些关于 Quartz 集群的问题,特别是关于触发器如何在集群内执行。 在执行作业时,quartz 是否对节点有任何偏好?例如总是或从不上次执行相同作业的节点,或者只是哪个节点首先执行作业? 是否
我记得我们不能终止当前正在运行的 Quartz Job,但我们可以中断并在必要时进行 bool 检查,是否需要进一步进行后续操作。 即使我们实现 InterruptableJob并调用schedule
我已经执行了 2 个作业( MyJob1 和 MyJob2 ),如下所示: public async Task ScheduleJob() { await _jobManage
我是一名优秀的程序员,十分优秀!