使用Quartz做计划任务时,默认情况下,当前任务总会执行,无论前一个任务是否结束。从如下日志可以看出,job被并发执行,无视前面任务是否结束。
13:14:04,095 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_QuartzSchedulerThread - new a simple job 13:14:04,095 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-1 - n=1 13:14:04,095 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-1 - group1.job1 executing at Sun Apr 07 13:14:04 CST 2013 13:14:06,001 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_QuartzSchedulerThread - new a simple job 13:14:06,001 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-2 - n=2 13:14:06,001 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-2 - group1.job1 executing at Sun Apr 07 13:14:06 CST 2013 13:14:07,095 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-1 - group1.job1 done. 13:14:08,001 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_QuartzSchedulerThread - new a simple job 13:14:08,001 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-3 - n=3 13:14:08,001 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-3 - group1.job1 executing at Sun Apr 07 13:14:08 CST 2013 13:14:09,001 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-2 - group1.job1 done.
因此,如果采用默认条件,需要考虑并发执行的逻辑问题,否则需要设置为顺序执行。
第一种办法是为自定义的job加上@org.quartz.DisallowConcurrentExecution注解,告诉quartz不允许并发执行job任务。这个办法粗粒度地解决了并发问题,缺少灵活度,但很简单,也很简洁。
13:20:04,017 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_QuartzSchedulerThread - new a simple job 13:20:04,017 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-1 - n=1 13:20:04,017 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-1 - group1.job1 executing at Sun Apr 07 13:20:04 CST 2013 13:20:07,017 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-1 - group1.job1 done. 13:20:07,017 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_QuartzSchedulerThread - new a simple job 13:20:07,017 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-2 - n=2 13:20:07,017 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-2 - group1.job1 executing at Sun Apr 07 13:20:07 CST 2013 13:20:10,017 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-2 - group1.job1 done.
第二种办法是在job的执行方法体内编写处理代码
13:24:18,236 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_QuartzSchedulerThread - new a simple job 13:24:18,236 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-1 - n=1 13:24:18,236 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-1 - group1.job1 executing at Sun Apr 07 13:24:18 CST 2013 13:24:20,001 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_QuartzSchedulerThread - new a simple job 13:24:20,001 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-2 - < 13:24:21,236 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-1 - group1.job1 done. 13:24:22,001 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_QuartzSchedulerThread - new a simple job 13:24:22,001 INFO [creative.air.schedule.quartz.SimpleJob] DefaultQuartzScheduler_Worker-3 - n=2
相关测试代码:
最后需要注意的是,quartz的发展出现了分支,目前存在并行版本
spring与quartz1集成更友好
相关推荐
这些类允许开发者定义任务执行的时间规则,并且可以灵活地与Spring容器中的bean进行集成。 quartz-examples-2.1.6.jar 提供了Quartz的示例代码,这些示例可以帮助开发者更好地理解和学习如何使用Quartz的各种特性,...
Quartz-Scheduler还提供了丰富的API来支持如暂停、恢复、删除任务,以及对任务执行状态的查询等功能。同时,它也支持集群环境,可以在多台服务器上部署,提供高可用性和容错性。 总的来说,Quartz-Scheduler是一个...
如果你的应用有任务需要在给定时间执行,或者你的系统需要定期执行某些任务,那么 Quartz Scheduler 就是你的理想选择。例如: * 驱动工作流进程:当一个新订单生成后,指定一个计划任务在 2 小时后触发,该任务将...
JAVA,quartz 2.1.6开发包。
创建作业涉及定义作业的类,并实现`org.quartz.Job`接口。作业类需要重写`execute`方法,其中编写具体的业务逻辑。 #### 定义触发器 触发器决定了作业何时何地被执行。Quartz Scheduler支持多种类型的触发器,包括...
Job 是实际要执行的任务,可以是任何实现了 `org.quartz.Job` 接口的类;Trigger 则定义了 Job 的执行时间,如简单触发器或cron触发器。 在部署 Quartz 2.1.6 时,你需要包含以下关键组件: 1. **Quartz JAR 文件**...
quartz-2.1.6.jar quartz-all-2.1.6.jar quartz-backward-compat-2.1.6.jar quartz-commonj-2.1.6.jar quartz-examples-2.1.6.jar quartz-jboss-2.1.6.jar quartz-oracle-2.1.6.jar quartz-weblogic-2.1.6.jar
{ "quartz.plugin.xml.fileNames", xmlConfig }, // 其他必要的配置项... }; using (var factory = new StdSchedulerFactory(properties)) { var scheduler = await factory.GetSchedulerAsync(); await ...
java 定时任务 quartz all 2.1.6
Quartz是一款开源的作业调度框架,它允许开发者创建和安排任务执行。在Java应用程序中,Quartz能够帮助我们在特定的时间点或按照预设的周期执行某些功能,如数据收集、日志清理等。当我们需要终止某个正在运行的任务...
开发者需要自定义Job类,继承自`org.quartz.Job`接口,并实现`execute`方法,这是任务执行的入口。 2. **Trigger(触发器)**:Trigger定义了何时触发Job执行。Quartz提供了多种类型的Trigger,如SimpleTrigger...
它是一个实现了`org.quartz.Job`接口的类,包含具体的业务逻辑。作业不直接与调度器交互,而是通过作业细节(JobDetail)来关联。 2. 作业细节(JobDetail):包含了作业的所有元数据,如作业的名称、组名、状态和...
Quartz 是一个开源的工作调度框架,它允许程序员在 Java 应用程序中安排任务执行。这个 "quartz-1.8.3.jar" 文件是 Quartz 框架的一个特定版本,版本号为 1.8.3。在这个版本中,Quartz 提供了对计划任务管理和执行的...
Quartz.NET是一个开源的作业调度框架,用于在.NET环境中创建和执行计划任务。这个压缩包“Quartz.net 3.0.7.0数据库持久化.rar”包含了关于如何使用Quartz.NET实现任务调度的数据库持久化和集群配置的资料。Quartz...
Quartz允许你精确地控制任务执行的时间,例如按小时、分钟、甚至秒来设定触发时间,也可以设置成周期性的执行。 在Quartz中,你需要创建Job类来实现自定义的任务逻辑,然后通过JobBuilder创建JobDetail对象,定义...
5. **集群同步**:Quartz的`StatefulJob`接口可以防止同一任务在集群中的多个节点同时执行,但需要注意的是,如果任务不是状态化的(即实现了`org.quartz.Job`而非`StatefulJob`),则需要自定义逻辑来保证执行的...
- 创建一个实现了`org.quartz.Job`接口的类,该类代表了要执行的任务。 - 使用`@DisallowConcurrentExecution`注解可确保同一时间只有一个实例在执行。 - 定义一个`JobDetail`实例,关联上面创建的`Job`类,并...
import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class QuartzExample { ...
这确保了系统重启后,任务仍然能够按照预定计划执行。 5. **插件机制**:Quartz提供了丰富的插件接口,如JobStore(用于存储Job和Trigger)、ThreadPool(线程池)等,方便扩展和定制。 6. **API与配置**:Quartz...
例如 `org.quartz.Scheduler` 是整个调度系统的入口,`org.quartz.Job` 是用户自定义任务的接口,`org.quartz.Trigger` 定义了触发作业的规则。 - **org.quartz.impl**:包含 Quartz 的实现类,如 `org.quartz.impl...