概述
项目地址:
https://github.com/yuleiqq/quartz_example/tree/master/quartz_study
本篇介绍如何给一个Job 添加多个触发器.
有些调度要求过于复杂,无法用单个触发器来表示——例如“上午9点到10点之间每5分钟一次,下午1点到10点之间每20分钟一次”。此场景中的解决方案是简单地创建两个触发器,并将它们都注册到同一个作业中。
先看如下的代码
package com.example03;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
/**
* @author : yulei
* @data : 2020/1/17 10:23
* @Version : 1.0
*
* 上午9点到10点之间每5分钟一次,下午1点到10点之间每20分钟一次
*
**/
public class CronTriggerExample2 {
public void run () throws SchedulerException {
//实例化调度器
Scheduler scheduler =StdSchedulerFactory.getDefaultScheduler();
//实例化job
JobDetail job1 = JobBuilder.newJob(SimpleJob.class)
.withIdentity("job1","group1")
.build();
//定义Contrigger
CronTrigger cronTrigger1 = TriggerBuilder.newTrigger()
.withIdentity("trigger1","group1")
.withSchedule(CronScheduleBuilder.cronSchedule(" 0/10 45 * * * ? "))
.build();
CronTrigger cronTrigger2 = TriggerBuilder.newTrigger()
.withIdentity("trigger2","group1")
.withSchedule(CronScheduleBuilder.cronSchedule(" 0/3 42 * * * ? "))
.build();
//调度器绑定Trigger
scheduler.scheduleJob(job1,cronTrigger1);
scheduler.scheduleJob(job1,cronTrigger2);
scheduler.start();
}
public static void main(String[] args) throws SchedulerException {
CronTriggerExample2 example = new CronTriggerExample2();
example.run();
}
}
运行之后,弹出如下错误
Exception in thread "main" org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'group1.job1', because one already exists with this identification.
at org.quartz.simpl.RAMJobStore.storeJob(RAMJobStore.java:279)
at org.quartz.simpl.RAMJobStore.storeJobAndTrigger(RAMJobStore.java:251)
at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:855)
at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:249)
at com.example03.CronTriggerExample2.run(CronTriggerExample2.java:40)
at com.example03.CronTriggerExample2.main(CronTriggerExample2.java:48)
说明,这样直接给任务添加多个调度器是行不通的,我们换一种方式,看如下代码:
package com.example03;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
/**
* @author : yulei
* @data : 2020/1/17 10:23
* @Version : 1.0
*
* 上午9点到10点之间每5分钟一次,下午1点到10点之间每20分钟一次
*
* 参考: https://www.iteye.com/problems/47143
**/
public class CronTriggerExample3 {
public void run () throws SchedulerException {
//实例化调度器
Scheduler scheduler =StdSchedulerFactory.getDefaultScheduler();
//实例化job
JobDetail job1 = JobBuilder.newJob(SimpleJob.class)
.withIdentity("job1","group1")
// 当job 没有绑定trigger时,继续保存在调度器中
.storeDurably()
.build();
//若有相同名称的job ,是否替换,否则抛出异常, 使用这个方法,必须保证 isDurable=true
scheduler.addJob(job1,false);
//定义Contrigger
CronTrigger cronTrigger1 = TriggerBuilder.newTrigger()
.withIdentity("trigger1","group1")
.withSchedule(CronScheduleBuilder.cronSchedule(" 0/10 47 * * * ? "))
.forJob(job1)
.build();
CronTrigger cronTrigger2 = TriggerBuilder.newTrigger()
.withIdentity("trigger2","group1")
.withSchedule(CronScheduleBuilder.cronSchedule(" 0/20 48 * * * ? "))
//绑定Jobdetail
.forJob(job1)
.build();
CronTrigger cronTrigger3 = TriggerBuilder.newTrigger()
.withIdentity("trigger3","group1")
.withSchedule(CronScheduleBuilder.cronSchedule(" 0/30 49 * * * ? "))
//绑定Jobdetail
.forJob(job1)
.build();
// scheduler.addJob(job1,true);
//调度器绑定Trigger
scheduler.scheduleJob(cronTrigger1);
scheduler.scheduleJob(cronTrigger2);
scheduler.scheduleJob(cronTrigger3);
scheduler.start();
}
public static void main(String[] args) throws SchedulerException {
CronTriggerExample3 example = new CronTriggerExample3();
example.run();
}
}
打印效果如下:
[INFO] 17 一月 09:40:00.020 下午 MyScheduler_Worker-1 [com.example03.SimpleJob]
SimpleJob says: group1.job1 executing at Fri Jan 17 21:40:00 CST 2020
[INFO] 17 一月 09:40:10.006 下午 MyScheduler_Worker-2 [com.example03.SimpleJob]
SimpleJob says: group1.job1 executing at Fri Jan 17 21:40:10 CST 2020
[INFO] 17 一月 09:40:20.004 下午 MyScheduler_Worker-3 [com.example03.SimpleJob]
SimpleJob says: group1.job1 executing at Fri Jan 17 21:40:20 CST 2020
[INFO] 17 一月 09:40:30.004 下午 MyScheduler_Worker-4 [com.example03.SimpleJob]
SimpleJob says: group1.job1 executing at Fri Jan 17 21:40:30 CST 2020
[INFO] 17 一月 09:40:40.004 下午 MyScheduler_Worker-5 [com.example03.SimpleJob]
SimpleJob says: group1.job1 executing at Fri Jan 17 21:40:40 CST 2020
[INFO] 17 一月 09:40:50.007 下午 MyScheduler_Worker-6 [com.example03.SimpleJob]
SimpleJob says: group1.job1 executing at Fri Jan 17 21:40:50 CST 2020
[INFO] 17 一月 09:41:00.004 下午 MyScheduler_Worker-7 [com.example03.SimpleJob]
SimpleJob says: group1.job1 executing at Fri Jan 17 21:41:00 CST 2020
[INFO] 17 一月 09:41:20.003 下午 MyScheduler_Worker-8 [com.example03.SimpleJob]
SimpleJob says: group1.job1 executing at Fri Jan 17 21:41:20 CST 2020
[INFO] 17 一月 09:41:40.016 下午 MyScheduler_Worker-9 [com.example03.SimpleJob]
SimpleJob says: group1.job1 executing at Fri Jan 17 21:41:40 CST 2020
[INFO] 17 一月 09:42:00.005 下午 MyScheduler_Worker-10 [com.example03.SimpleJob]
SimpleJob says: group1.job1 executing at Fri Jan 17 21:42:00 CST 2020
[INFO] 17 一月 09:42:30.004 下午 MyScheduler_Worker-11 [com.example03.SimpleJob]
SimpleJob says: group1.job1 executing at Fri Jan 17 21:42:30 CST 2020
小结:
每个任务JobDetail可以绑定多个Trigger,但一个Trigger只能绑定一个任务,这种绑定关系由四种接口来执行:
1、该接口的作用是在将任务加入Quartz的同时绑定一个Trigger,Quartz会在加入该任务后自动设置Trigger的JobName与 JobGroup为该 JobDetail的name与group;
Scheduler#scheduleJob(JobDetail, Trigger)
2、 该接口的作用是将该Trigger绑定到其JobName与JobGroup指向的任务JobDetail。这时的name与group需要在Trigger绑定前 由Quartz的使用者来设置与调用
Scheduler#scheduleJob(Trigger)
3、 替换一个指定的Trigger, 即解除指定Trigger与任务的绑定,并将新的Trigger与任务绑定,Quartz会自动调整新Trigger的 JobName与JobGroup,而旧的Trigger将被移除
Scheduler#rescheduleJob(String, String, Trigger)
4、创建一个立即触发的Trigger,并将其与name与group指定的任务绑定
Scheduler#triggerJob(String, String)
JobDetail有个属性叫durable,表明该任务没有任何trigger绑定时仍保存在Quartz的JobStore中,默认为false。
若JobDetail的durable属性为false,则任务将会从Quartz移除。
最后
以上就是体贴长颈鹿为你收集整理的CronTrigger 示例 2 ----绑定多个触发器的全部内容,希望文章能够帮你解决CronTrigger 示例 2 ----绑定多个触发器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复