总结一下经典的定时处理框架quartz的使用经验。基于 Ver. 1.8.0
1.配置方式
最常用的方式properties + xml定义
org.quartz.scheduler.instanceName = CMS_Batch
org.quartz.scheduler.instanceId = AUTO
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadPriority = 5
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = quartz_data.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
#默认会联网检查是否有更新,还是skip为好
org.quartz.scheduler.skipUpdateCheck = true
properties定义全局信息(全局Listener也在这定义),xml定义Job、trigger信息
<?xml version="1.0" encoding="UTF-8"?>
<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
version="1.8">
<pre-processing-commands>
<delete-jobs-in-group>*</delete-jobs-in-group> <!-- clear all jobs in scheduler -->
<delete-triggers-in-group>*</delete-triggers-in-group> <!-- clear all triggers in scheduler -->
</pre-processing-commands>
<processing-directives>
<overwrite-existing-data>true</overwrite-existing-data>
<ignore-duplicates>false</ignore-duplicates>
</processing-directives>
<schedule>
<job>
<name>FooJob</name>
<group>FooBatch</group>
<description>定时运行Job</description>
<job-class>xxx.yyy.FooJob</job-class>
<volatility>false</volatility>
<durability>true</durability>
<recover>false</recover>
</job>
<trigger>
<cron>
<name>FooTrigger</name>
<group>FooBatch</group>
<job-name>FooJob</job-name>
<job-group>FooBatch</job-group>
<misfire-instruction>MISFIRE_INSTRUCTION_FIRE_ONCE_NOW</misfire-instruction>
<cron-expression>30/15 * 13 * * ?</cron-expression>
<!-- 秒 分 时 日 月 星期 年 -->
</cron>
</trigger>
<job>
<name>barJob</name>
<group>FooBatch</group>
<description>无trigger的Job</description>
<job-class>xxx.yyy.barJob</job-class>
<volatility>false</volatility>
<durability>true</durability>
<recover>false</recover>
</job>
</schedule>
</job-scheduling-data>
与J2ee容器结合,提供QuartzInitializerListener,可设定随容器自动启动,这个很方便
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Foo Batch</display-name>
<context-param>
<param-name>quartz:config-file</param-name>
<param-value>/quartz.properties</param-value>
</context-param>
<listener>
<listener-class>
org.quartz.ee.servlet.QuartzInitializerListener
</listener-class>
</listener>
</web-app>
2.Job、Trigger、Listener
Job需要由Trigger启动,可以有多个Listener
Trigger同样可以有多个Listener
3.有待改进的地方
Trigger不完善,只提供了“定时”Trigger,其他诸如基于Job完成与否或完成状态的Trigger需要自己靠Listener实现。
配置不完善,配置文件只提供全局Listener定义,针对Job或Trigger的Listener要程序添加,另外1.8版本在配置无Trigger的Job时有bug(XMLSchedulingDataProcessor 1015行需要nullcheck),直接导致xml解析错误,感觉这自带的plugin还很简陋。
plugin和Job同级别
,(这个说法有点偏颇,但是产生的效果类似)这意味着在schedule启动前是不会解析配置文件的,只能在启动后调整Job等等内容,同时scheduler.getJobDetail取的Job是通过clone方式取得的,任何对Job的修改都无效...这个很无语
(clone的方式还是有道理的,已经设置好的Job不能随便改动)
scheduler.start(); //启动后读取配置文件等等
JobDetail fooJob = scheduler.getJobDetail("FooJob",
"FooBatch");
fooJob.addJobListener(someListener);
//取Job对应的Trigger
Trigger[] triggers = scheduler.getTriggersOfJob(fooJob.getName(),
fooJob.getGroup());
scheduler.addJob(fooJob, true); //true指明替换已有Job(没有关联Trigger)
//清除旧Trigger,重新建立Job和Trigger关联
for (Trigger trigger : triggers) {
scheduler.rescheduleJob(trigger.getName(), trigger.getGroup(), trigger);
}
分享到:
相关推荐
在Android中使用Quartz需要注意以下几点: - **主线程限制**:由于Android对主线程的操作有严格限制,所有耗时操作应放在后台线程执行,避免阻塞UI。 - **生命周期管理**:确保在应用启动时启动调度器,并在退出时...
在对Quartz进行封装时,博主可能实现了以下几点: 1. **配置简化**:可能创建了一个配置类,用于集中管理Quartz的相关配置,如数据库连接、JobStore类型(内存或持久化存储)、线程池大小等,使得配置过程更加直观...
然而,如果一个任务被意外地调度了两次,那么可能的原因有以下几点: 1. **代码逻辑错误**:可能是代码中创建了两个相同的 Job 和 Trigger 组合,或者在代码中错误地调用了 `scheduler.scheduleJob()` 方法两次。 ...
在Quartz中实现集群,主要涉及到以下几个关键点: 1. **持久化存储**: Quartz集群需要将所有调度信息(如Job、Trigger)存储在一个共享的持久化存储中,以便所有集群节点都能访问。这通常通过实现`...
Quartz提供了几种集群策略: - RAMJobStore:不适用于集群,因为它只在内存中存储job和trigger,重启后会丢失。 - JDBCJobStore:推荐在集群环境中使用,将job和trigger的状态存储在数据库中,多台服务器共享同一份...
总结,Quartz集群配置涉及到数据库、配置文件、Job和Trigger的定义,以及集群监听器的设置。通过这些配置,可以实现任务的高可用性和并发控制,提高系统的整体稳定性。示例源码通常会展示如何创建Job、Trigger,以及...
在实际项目中,我们还会关注以下几个关键点: 1. **集群支持**:Quartz支持在多台服务器上分布式部署,确保高可用性和任务的不丢失。 2. **持久化**:Quartz支持将Job和Trigger的信息存储在数据库中,即使服务重启,...
总结一下,"mysql+quartz"的主题涵盖了以下几个关键知识点: 1. Quartz Scheduler的基本概念和用法,包括Job和Trigger的定义。 2. 如何配置Quartz使用MySQL作为持久化存储,利用JDBCJobStore。 3. Spring框架与...
总结来说,Spring与Quartz的集成主要涉及以下几个核心知识点: 1. 引入Quartz和Spring相关依赖 2. 配置SchedulerFactoryBean以启动Quartz调度器 3. 定义JobDetail和Trigger,包括任务的执行类、方法和执行时间 4. 将...
### Spring整合Quartz常见问题详解 ...然而,在实践中也可能会遇到各种问题,如本文中列举的几点常见问题及其解决方案。通过合理的配置和优化,可以有效避免这些问题的发生,确保任务调度的稳定性和可靠性。
总结来说,Quartz异步消息任务跟踪涉及到以下几个关键点: 1. 自定义`Job`类,实现业务逻辑。 2. 使用消息中间件进行异步消息发送。 3. 利用`JobDataMap`存储和跟踪任务状态。 4. 设计合适的`Trigger`策略以满足调度...
比较Spring 2.0的`Job`和Quartz,我们可以总结以下几点差异: 1. 灵活性:Quartz提供了更丰富的定时策略,如CRON表达式,而Spring 2.0的`Job`通常适用于简单的定时需求。 2. 复杂性:Quartz的配置和使用相比Spring ...
为了获得更好的性能和用户体验,需要注意以下几点优化: 1. 减少不必要的重绘:避免在整个视图上频繁调用`setNeedsDisplay`,而是尽可能精确地指定需要更新的区域。 2. 使用CADisplayLink:对于需要与屏幕刷新同步...
总结一下,Spring结合Quartz调度器的使用主要包括以下几个步骤: 1. 引入Quartz和Spring支持的依赖。 2. 配置Spring的ApplicationContext,创建Scheduler、Job和Trigger。 3. 编写执行定时任务的服务类。 4. 根据...
下面是关于 Quartz 使用详解的知识点总结。 一、实例化 Scheduler 在使用 Quartz 之前, 必须使用 SchedulerFactory 实例化 Scheduler。实例化 Scheduler 后,可以启动或停止 Scheduler。注意,一旦 Scheduler ...
2. **配置Quartz**:在Spring的配置文件(如applicationContext.xml)中,我们需要声明一个`SchedulerFactoryBean`,它是Spring管理Quartz调度器的入口点。这里可以设置Quartz的相关属性,如数据库连接、线程池大小...
#### 五、总结 通过本文档的学习,我们可以看到 Quartz 的 Cron 表达式是一种非常灵活且强大的工具,能够满足各种复杂的定时任务需求。掌握 Cron 表达式的正确使用方法对于实现精准的任务调度至关重要。无论是简单的...
在Spring中配置Quartz主要包括以下几个步骤: 1. **添加依赖**: 如果使用Maven或Gradle管理项目依赖,需要添加Quartz的相关依赖。 2. **创建SchedulerFactoryBean**: 这是Quartz的核心组件,负责创建和管理...
下面我们将详细介绍如何在Spring中配置Quartz,以及相关的知识点。 首先,我们需要创建一个被调度的类,这个类通常会包含一个或多个方法,这些方法将在特定时间由Quartz执行。例如,在给定的代码中,我们有一个名为...
这通常涉及以下几点: - **Servlet 定义**:定义一个用于初始化 Quartz 的 Servlet 类。 - **初始化参数**:指定 Quartz 的配置文件位置等。 - **加载顺序**:设置 `load-on-startup` 属性来确保在应用启动时自动...