Quartz学习之常用Trigger方法记录

Trigger分类

Quartz中共包含有4种触发器。

常用的是: SimpleTriggerCronTrigger
不常用的是:CalendarIntervalTriggerDailyTimeIntervalTrigger。虽然后面两种用到的不是特别多,但是在特定的场景下,也是有不可替代的作用(具体看下官方文档)。

CalendarIntervalTrigger: 根据一个给定的日历时间进行重复,可以设置启动时间。它可以完成 SimpleTrigger(比如每个月,因为月不是一个确定的秒数)和CronTrigger(比如5个月,因为5个月并不是12个月的公约数)不能完成的一些任务。注意,使用month作为周期单位时,如果起始日期是在某月的最后一天,比如1月31日,那么下一个激活日在2月28日,以后所有的激活日都在当月的28日。如果你要严格限制在每月的最后一天激活,那你需要使用cronTrigger。不受夏令时引起的时钟偏移影响。

DailyTimeIntervalTrigger:在给定的时间窗口或指定的星期以秒、分钟、小时为周期进行重复。比如,每天早上8:00到11:00之间,每隔72分钟激活;或者每周的周一到周五9:20到16:47之间,每隔23分钟激活。

SimpleTrigger 常用的方法记录

SimpleTrigger的属性包括:开始时间、结束时间、重复次数以及重复的间隔。

重复次数,可以是0、正整数,以及常量SimpleTrigger.REPEAT_INDEFINITELY。重复的间隔,必须是0,或者long型的正数,表示毫秒。注意,如果重复间隔为0,trigger将会以重复次数并发执行(或者以scheduler可以处理的近似并发数)。

指定时间开始触发,不重复

SimpleTrigger trigger = (SimpleTrigger) newTrigger() 
        .withIdentity("trigger1", "group1")
        .startAt(myStartTime)                     // some Date 
        .forJob("job1", "group1")                 // identify job with name, group strings
        .build();

指定时间触发,每隔10秒执行一次,重复10次

trigger = newTrigger()
        .withIdentity("trigger3", "group1")
        .startAt(myTimeToStartFiring)  // if a start time is not given (if this line were omitted), "now" is implied
        .withSchedule(simpleSchedule()
            .withIntervalInSeconds(10)
            .withRepeatCount(10)) // note that 10 repeats will give a total of 11 firings
        .forJob(myJob) // identify job with handle to its JobDetail itself                   
        .build();

立即触发,每个5分钟执行一次,直到22:00:

trigger = newTrigger()
        .withIdentity("trigger7", "group1")
        .withSchedule(simpleSchedule()
            .withIntervalInMinutes(5)
            .repeatForever())
        .endAt(dateOf(22, 0, 0))
        .build();

建立一个触发器,将在下一个小时的整点触发,然后每2小时重复一次:

trigger = newTrigger()
        .withIdentity("trigger8") // because group is not specified, "trigger8" will be in the default group
        .startAt(evenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00"))
        .withSchedule(simpleSchedule()
            .withIntervalInHours(2)
            .repeatForever())
        // note that in this example, 'forJob(..)' is not called which is valid 
        // if the trigger is passed to the scheduler along with the job  
        .build();

    scheduler.scheduleJob(trigger, job);

建立一个触发器,将在下一个小时的整点触发,然后每2小时重复一次

    trigger = newTrigger()
        .withIdentity("trigger8") // because group is not specified, "trigger8" will be in the default group
        .startAt(evenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00"))
        .withSchedule(simpleSchedule()
            .withIntervalInHours(2)
            .repeatForever())
        // note that in this example, 'forJob(..)' is not called which is valid 
        // if the trigger is passed to the scheduler along with the job  
        .build();

    scheduler.scheduleJob(trigger, job);

CronTrigger 常用的方法记录

CronTrigger 通常比 Simple Trigger 更有用,如果需要基于日历的概念而不是按照 SimpleTrigger 的精确指定间隔进行重新启动的作业启动计划。

使用 CronTrigger ,可以指定号时间表,例如“每周五中午”或“每个工作日和上午9:30”,甚至“每周一至周五上午9:00至10点之间每5分钟”和1月份的星期五“。

即使如此,和 SimpleTrigger 一样,CronTrigger 有一个 startTime ,它指定何时生效,以及一个(可选的)endTime,用于指定何时停止计划。

建立一个触发器,每隔一分钟,每天上午8点至下午5点之间

trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 0/2 8-17 * * ?"))
    .forJob("myJob", "group1")
    .build();

建立一个触发器,将在每天上午10:42执行

// 第一种实现方式
trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(dailyAtHourAndMinute(10, 42))
    .forJob(myJobKey)
    .build();
    
// 第二种实现方式
trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 42 10 * * ?"))
    .forJob(myJobKey)
    .build();

建立一个触发器,将在星期三上午10:42在TimeZone(系统默认值)之外执行

// 第一种方式
trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(weeklyOnDayAndHourAndMinute(DateBuilder.WEDNESDAY, 10, 42))
    .forJob(myJobKey)
    .inTimeZone(TimeZone.getTimeZone("America/Los_Angeles"))
    .build();
    
// 第二种方式
  trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 42 10 ? * WED"))
    .inTimeZone(TimeZone.getTimeZone("America/Los_Angeles"))
    .forJob(myJobKey)
    .build();
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Quartz是一个开源的作业调度框架,可以用来实现定时任务的调度和执行。它提供了很多的API和功能,其中一个重要的组件就是TriggerTrigger是用来触发一个Job的执行的组件,可以理解为定时器。当Trigger满足一定的条件时,就会触发对应的Job执行。 Quartz中的Trigger有很多种类型,比如SimpleTrigger、CronTrigger等等,每种Trigger都有自己的特点和用途。在Quartz中,我们可以监听Trigger的状态变化,比如Trigger被触发、Trigger被暂停、Trigger被删除等等。通过监听Trigger的状态变化,我们可以在某些特定的时刻执行一些操作,比如记录日志、发送通知等等。 要监听Trigger的状态变化,我们需要实现Quartz提供的TriggerListener接口,该接口定义了一些回调方法,比如triggerFired、triggerPaused、triggerResumed等等。当Trigger的状态发生变化时,Quartz会自动调用对应的回调方法,我们可以在回调方法中执行相应的操作。 下面是一个简单的Trigger监听器的示例代码: ```java public class MyTriggerListener implements TriggerListener { public String getName() { return "MyTriggerListener"; } public void triggerFired(Trigger trigger, JobExecutionContext context) { System.out.println("Trigger fired: " + trigger.getKey()); } public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) { return false; } public void triggerMisfired(Trigger trigger) { System.out.println("Trigger misfired: " + trigger.getKey()); } public void triggerComplete(Trigger trigger, JobExecutionContext context, Trigger.CompletedExecutionInstruction triggerInstructionCode) { System.out.println("Trigger completed: " + trigger.getKey()); } } ``` 在上面的代码中,我们实现了TriggerListener接口,并重写了其中的几个回调方法。getName方法返回该监听器的名称,triggerFired方法Trigger被触发时被调用,triggerMisfired方法Trigger错过触发时被调用,triggerComplete方法Trigger完成后被调用。在每个回调方法中,我们可以实现自己的逻辑。最后,我们需要将该监听器注册到Quartz的Scheduler中: ```java scheduler.getListenerManager().addTriggerListener(new MyTriggerListener()); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值