资讯专栏INFORMATION COLUMN

Quartz学习之常用Trigger方法记录

vibiu / 2536人阅读

摘要:分类中共包含有种触发器。建立一个触发器,每隔一分钟,每天上午点至下午点之间建立一个触发器,将在每天上午执行第一种实现方式第二种实现方式建立一个触发器,将在星期三上午在系统默认值之外执行第一种方式第二种方式

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();

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71209.html

相关文章

  • Quartz习之入门

    摘要:触发器也可以给予名称和放置在组中,以方便地将它们调度内组织。作业可以被添加到所述调度器一次,而是具有多个触发器注册。调度类链接工作和触发器到一起,并执行它。 简介 Quartz是一个开源的作业调度框架,可以让计划的程序任务一个预定义的日期和时间运行。Quartz可以用来创建简单或复杂的日程安排执行几十,几百,甚至是十万的作业数。官方链接,戳这里 Quartz是什么? 作业调度库 Qua...

    Pandaaa 评论0 收藏0
  • Quartz习之多作业、监听

    摘要:多作业例子在这个例子中,我们将介绍如何通过多个作业。在调度框架中,每个作业将被连接到一个唯一的触发,并且由调度器运行它。备注说明在中,一个触发器触发多个作业是不可以的。第一步创建个作业,,和。 多作业例子 在这个例子中,我们将介绍如何通过Quartz API 多个作业。在Quartz调度框架中,每个作业将被连接到一个唯一的触发,并且由调度器运行它。 备注说明:在 Quartz 中,一个...

    miracledan 评论0 收藏0
  • Quartz习之Cron Expressions表达式

    摘要:请注意,触发器将不会在上午点开始,仅在,,和请注意,一些调度要求太复杂,无法用单一触发表示例如每上午至之间每分钟,下午至晚上点之间每分钟一次。在这种情况下的解决方案是简单地创建两个触发器,并注册它们来运行相同的作业。 表达式说明 Cron-Expressions 用于配置 CronTrigger的实例。Cron Expressions 是由七个子表达式组成的字符串,用于描述日程表的各个...

    Mr_zhang 评论0 收藏0
  • 慕课网_《Java定时任务调度工具详解之Quartz篇》习总结

    摘要:时间年月日星期一说明本文部分内容均来自慕课网。属性任务名称任务所属组任务实现类传参的作用浅谈上是什么当调用一个,就会将传递给的方法能通过对象访问到运行时候的环境以及本身的明细数据。 时间:2017年06月26日星期一说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码...

    hiYoHoo 评论0 收藏0
  • Quartz实现工作流

    摘要:也有,触发点和相关,和我们的需求关系不大,暂忽略。实现为每个算法任务创建一个,任务失败不能启动后续任务,所以在运行失败的情况下,需要把启动的删除掉。需要自己在中实现多个依赖是否完成的检查。后续主线程的任务就是检查工作流是否已经完成。 Quartz简介 作为一个优秀的开源调度框架,Quartz 具有以下特点:强大的调度功能,支持立即调度、定时调度、周期调度、并发调度; 灵活的应用方式,支...

    Apollo 评论0 收藏0

发表评论

0条评论

vibiu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<