CronTrigger 示例 2 ----绑定多个触发器

项目地址:  

    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移除。 

 

发布了192 篇原创文章 · 获赞 254 · 访问量 76万+

猜你喜欢

转载自blog.csdn.net/yulei_qq/article/details/104017484
今日推荐