当前位置: 首页 > news >正文

Quartz(2-Trigger)

相关文章链接

  1. 定时任务工具类(Cron Util)
  2. SpringBoot Task
  3. Quartz(1-Job)
  4. Quartz(2-Trigger)

Trigger

方法

  1. 优先级(priority)

如果你的 trigger 很多(或者 Quartz 线程池的工作线程太少),Quartz 可能没有足够的资源同时触发所有的 trigger;这种情况下,你可能希望控制哪些 trigger 优先使用 Quartz 的工作线程,要达到该目的,可以在 trigger 上设置 priority 属性。

比如,你有 N 个 trigger 需要同时触发,但只有 Z 个工作线程,优先级最高的 Z 个 trigger 会被首先触发

  1. 错过触发(misfire instructions)

如果 scheduler 关闭了,或者 Quartz 线程池中没有可用的线程来执行 job,此时持久性的 trigger 就会错过(miss)其触发时间,即错过触发(misfire)。当下次调度器启动或者有可以线程时,会检查处于 misfire 状态的 Trigger。而 misfire 的状态值决定了调度器如何处理这个 Trigger。

不同类型的 trigger,有不同的 misfire 机制。它们默认都使用“智能机制(smart policy)”,即根据 trigger 的类型和配置动态调整行为

分类

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SimpleTrigger

为需要在特定的日期/时间启动,且以一个可能的间隔时间重复执行 n 次的 job 所设计的

  1. startNow():Scheduler 开始执行时,触发器也即执行
  2. startAt():在指定的时间开始执行
  3. endAt():结束时间

执行间隔:

  1. withInterval(TimeSpan timeSpan):通用的间隔执行方法
  2. withIntervalInHours(int hours):以小时为间隔单位进行执行
  3. withIntervalInMinutes(int minutes):以分钟为间隔单位进行执行
  4. withIntervalInSeconds(int seconds):以秒为间隔单位进行执行

执行时间:

  1. withRepeatCount(int repeatCount):执行多少次以后结束
  2. repeatForever():永远执行
  3. repeatMinutelyForever():一分钟执行一次(永远执行)
  4. repeatMinutelyForever(int minutes):每隔几分钟执行一次(永远执行)
  5. repeatMinutelyForTotalCount(int count, int minutes):每隔几分钟执行一次(执行次数为 count)类似的还有秒、小时。
public class Trigger1 {public static void main(String[] args) throws SchedulerException {//创建一个 JobDetail 的实例,将该实例与 HelloJob 绑定JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("testJob").build();//开始时间 3 秒钟之后 (具体时间按实际业务编写)Date sData = new Date();sData.setTime(sData.getTime() + 3000);//结束时间 20 秒钟之后 (具体时间按实际业务编写)Date eData = new Date();eData.setTime(eData.getTime() + 20000);//创建一个 Trigger 实例,定义该 job3 秒之后执行,在 6 秒之后结束SimpleTrigger zhlTrigger = TriggerBuilder.newTrigger().withIdentity("test").startAt(sData) //设定开始时间.endAt(eData)   //设定结束时间.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2) //每两秒打印一次.withRepeatCount(2)) // 重复 2 次.build();//创建 Scheduler 实例StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();Scheduler scheduler = stdSchedulerFactory.getScheduler();scheduler.start();scheduler.scheduleJob(jobDetail, zhlTrigger);}
}
public class HelloJob implements Job{public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {//打印当前的执行时间 例如 2017-11-22 00:00:00Date date = new Date();SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("现在的时间是:"+ sf.format(date));//具体的业务逻辑System.out.println("具体执行的业务...");JobKey key = jobExecutionContext.getJobDetail().getKey();Trigger trigger = jobExecutionContext.getTrigger();System.out.println("开始的时间:"+sf.format(trigger.getStartTime()));System.out.println("结束的事件:"+sf.format(trigger.getEndTime()));}
}

CronTrigger

指定对应的 cron 表达式执行任务

public class Trigger2 {public static void main(String[] args) throws SchedulerException {//创建一个 JobDetail 的实例,将该实例与 HelloJob 绑定JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("test").build();//开始时间 3 秒钟之后 (具体时间按实际业务编写)Date sData = new Date();sData.setTime(sData.getTime() + 3000);//结束时间 20 秒钟之后 (具体时间按实际业务编写)Date eData = new Date();eData.setTime(eData.getTime() + 20000);//创建一个 Trigger 实例,定义该 job3 秒之后执行,在 6 秒之后结束CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("testTrigger").startAt(sData) //设定开始时间.endAt(eData)   //设定结束时间.withSchedule(CronScheduleBuilder.cronSchedule("0/3 * * * * ?")).build();//创建 Scheduler 实例StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();Scheduler scheduler = stdSchedulerFactory.getScheduler();scheduler.start();scheduler.scheduleJob(jobDetail, trigger);}
}

CalendarIntervalTrigger

用来触发基于定时重复的 JobDetail,Trigger 将会每隔 N 个 Calendar 在 Trigger 中定义的时间单元触发一次,这个 Trigger 不适合使用 SimpleTrigger 完成(例如由于每一个月的时间不是固定的描述),也不适用于 CronTrigger(例如每 5 个月)

相较于 SimpleTrigger 有两个优势:

  1. 更方便,比如:每隔 1 小时执行,你不用自己去计算 1 小时等于多少毫秒。
  2. 支持不是固定长度的间隔,比如:间隔为月和年。但劣势是精度只能到秒。

参数:

  1. interval:执行间隔
  2. intervalUnit:执行间隔的单位(秒、分钟、小时、天、月、年、星期)
public class Trigger4 {public static void main(String[] args) throws SchedulerException {//创建一个 JobDetail 的实例,将该实例与 HelloJob 绑定JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("test").build();//开始时间 3 秒钟之后 (具体时间按实际业务编写)Date sData = new Date();sData.setTime(sData.getTime() + 3000);//结束时间 20 秒钟之后 (具体时间按实际业务编写)Date eData = new Date();eData.setTime(eData.getTime() + 20000);//创建一个 Trigger 实例,定义该 job3 秒之后执行,在 20 秒之后结束CalendarIntervalTrigger intervalTrigger = TriggerBuilder.newTrigger().withIdentity("testTrigger").startAt(sData) //设定开始时间.endAt(eData)   //设定结束时间.withSchedule(CalendarIntervalScheduleBuilder.calendarIntervalSchedule().withIntervalInSeconds(5))	// 每隔 5 秒执行一次.build();//创建 Scheduler 实例StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();Scheduler scheduler = stdSchedulerFactory.getScheduler();scheduler.start();scheduler.scheduleJob(jobDetail, intervalTrigger);}
}

DailyTimeIntervalTrigger

指定每天的某个时间段内,以一定的时间间隔执行任务,并且可以支持星期的设置

适合的任务类似于:指定每天 9:00 至 18:00,每隔 10 秒执行一次,并且只要周一至周五执行

参数:

  1. onEveryDay:每天
  2. onMondayThroughFriday:周一至周五,即工作日
  3. onSaturdayAndSunday:周六至周天,即休息日 e
  4. onDaysOfTheWeek:用数组的形式单独来指定一周中的哪几天
  5. startingDailyAt:表示开始于几点 (区别于前面的 StartAt)
  6. endingDailyAt:表示结束于几点 (区别于前面的 EndAt)
public class Trigger3 {public static void main(String[] args) throws SchedulerException {//创建一个 JobDetail 的实例,将该实例与 HelloJob 绑定JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("test").build();//开始时间 3 秒钟之后 (具体时间按实际业务编写)Date sData = new Date();sData.setTime(sData.getTime() + 3000);//结束时间 20 秒钟之后 (具体时间按实际业务编写)Date eData = new Date();eData.setTime(eData.getTime() + 20000);//创建一个 Trigger 实例,定义该 job3 秒之后执行,在 20 秒之后结束DailyTimeIntervalTrigger trigger = TriggerBuilder.newTrigger().withIdentity("testTrigger").startAt(sData) //设定开始时间.endAt(eData)   //设定结束时间.withSchedule(DailyTimeIntervalScheduleBuilder.dailyTimeIntervalSchedule().withIntervalInSeconds(3).onEveryDay()) //每天每隔 3 秒执行一次.build();//创建 Scheduler 实例StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();Scheduler scheduler = stdSchedulerFactory.getScheduler();scheduler.start();scheduler.scheduleJob(jobDetail, trigger);}
}

MutableTrigger

Trigger 只是定义了相关属性的 Get 方法,并没有 Set 方法,而 MutableTrigger 接口则定义了相关属性的 set 方法,如:setKey 方法。

OperableTrigger

OperableTrigger 接口从字面上来说时可操作的 Trigger,也就是 Trigger 被 QuartzSchedulerThread 获取到之后,在不同情况下需要进行操作的接口。

  1. computeFirstFireTime:计算第一次触发时间。
  2. triggered:trigger 被触发时调用的方法。
  3. updateAfterMisfire:对应触发器失火后调用的方法。
  4. executionComplete:触发器本次触发完成时被调用的方法。
http://www.lryc.cn/news/506732.html

相关文章:

  • 【微信小程序开发 - 3】:项目组成介绍
  • Leetcode 三角形最小路径和
  • DataOps驱动数据集成创新:Apache DolphinScheduler SeaTunnel on Amazon Web Services
  • Android Studio的笔记--BusyBox相关
  • MySQL 存储过程与函数:增强数据库功能
  • 网络安全(3)_安全套接字层SSL
  • Git 快速入门
  • AI学习记录 - 依据 minimind 项目入门
  • 数据结构----链表头插中插尾插
  • 设计模式-读书笔记
  • c语言----选择结构
  • KS曲线python实现
  • 解决matplotlib中文乱码问题
  • 实操给桌面机器人加上超拟人音色
  • git stash 的文件如何找回
  • 皮肤伤口分割数据集labelme格式248张5类别
  • uni-app开发AI康复锻炼小程序,帮助肢体受伤患者康复!
  • 双内核架构 Xenomai 4 安装教程
  • 【redis的使用、账号流程、游戏服Handler的反射调用】1.自增id 2.全局用户名这样子名字唯一 3.
  • neo4j 图表数据导入到 TuGraph
  • 启动报错java.lang.NoClassDefFoundError: ch/qos/logback/core/status/WarnStatus
  • 【ubuntu18.04】ubuntu18.04挂在硬盘出现 Wrong diagnostic page; asked for 1 got 8解决方案
  • kubeadm安装K8s高可用集群之集群初始化及master/node节点加入calico网络插件安装
  • 游戏何如防抓包
  • 【LeetCode】每日一题 2024_12_19 找到稳定山的下标(模拟)
  • 运维 mysql、redis 、RocketMQ性能排查
  • [SAP ABAP] 将内表数据转换为HTML格式
  • LLM大语言模型私有化部署-使用Dify与Qwen2.5打造专属知识库
  • 使用C语言连接MySQL
  • PyTorch 2.0 以下版本中设置默认使用 GPU 的方法