Quartz触发器
1. Trigger介绍
- Quartz中四类不同的触发器,但在实际中常用的是
CronTrigger
和SimpleTrigger
- JobKey:表示job实例的标识,触发器被触发时,该指定的job实例会被执行
- startTime:表示触发器的时间表,第一次开始被触发的时间,数据类型为Date
- endTime:指定触发器终止被触发的时间,数据类型为Date
2. 使用
-
/** * @Author: Hjx * @Date: 2021/8/30 17:20 */ public class TestTriggerQuartz { public static void main(String[] args) throws SchedulerException { Date startDate = new Date(); long time = startDate.getTime() + 10000; Date endDate = new Date(time); // 1. 获取调度器 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 2. 获取JobDetail JobDetail jobDetail = JobBuilder.newJob(TestTriggerJob.class) .withIdentity("JobDetail", "JobDetailGroup") .build(); // 3. 获取trigger Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("Trigger", "TriggerGroup") .startAt(startDate) .endAt(endDate) .build(); // 4. 通过调度器绑定任务和触发器 scheduler.scheduleJob(jobDetail,trigger); //5. 启动 scheduler.start(); } }
-
/** * @Author: Hjx * @Date: 2021/8/30 17:20 */ public class TestTriggerJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { Trigger trigger = context.getTrigger(); TriggerKey triggerKey = trigger.getKey(); String name = triggerKey.getName(); String group = triggerKey.getGroup(); System.out.println("触发器名称:"+name); System.out.println("触发器组名称:"+group); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date startTime = trigger.getStartTime(); System.out.println("开始时间:"+simpleDateFormat.format(startTime)); Date endTime = trigger.getEndTime(); System.out.println("结束时间:"+simpleDateFormat.format(endTime)); } }
3. SimpleTrigger
-
SimpleTrigger对于设置和使用是最简单的一种QuartzTrigger
-
是为那种需要在特定的日期/时间启动,且以一个可能的时间间隔重复执行n次的Job设计的
-
修改TestTriggerQuartz
-
/** * @Author: Hjx * @Date: 2021/8/30 17:20 */ public class TestTriggerQuartz { public static void main(String[] args) throws SchedulerException { Date startDate = new Date(); long time = startDate.getTime() + 10000; Date endDate = new Date(time); // 1. 获取调度器 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 2. 获取JobDetail JobDetail jobDetail = JobBuilder.newJob(TestTriggerJob.class) .withIdentity("JobDetail", "JobDetailGroup") .build(); // 3. 获取trigger Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("Trigger", "TriggerGroup") .startAt(startDate) .withSchedule( SimpleScheduleBuilder.repeatSecondlyForever(1) .withRepeatCount(3) ) .endAt(endDate) .build(); // 4. 通过调度器绑定任务和触发器 scheduler.scheduleJob(jobDetail,trigger); //5. 启动 scheduler.start(); } }
-
这样每隔一秒执行一次任务,执行三次,相似的SimpleScheduleBuilder方法还有
-
RepeatForever:指定触发器将无限期重复。 WithRepeatCount:指定重复次数 WithInterval:以毫秒为单位指定重复间隔,由于是TimeSpan也可以指定时分秒 WithIntervalInHours:以小时为单位指定重复间隔 WithIntervalInMinutes:以分钟单位指定重复间隔 WithIntervalInSeconds:以秒为单位指定重复间隔 RepeatMinutelyForever RepeatMinutelyForTotalCount RepeatSecondlyForever RepeatSecondlyForTotalCount RepeatHourlyForever RepeatHourlyForTotalCount
-
在指定了结束时间和执行次数后,哪一个条件先执行完就结束,
-
指定的间隔时间不能为0
4. CronTrigger
- 需要像日历那样按照日程来触发任务
- CronTrigger是基于日历的作业调度器
4.1 Cron表达式
-
cron表达式是一个由7个子表达式组成的字符串。每个子表达式都描述了一个单独的日程细节,以空格分隔,分别表示
-
Second 秒
-
Minutes 分钟
-
Hours小时
-
Day-of-Month 月中的天
-
Month 月
-
Day-of-Week 周中的天
-
Year 年(可选)
-
-
-
/** * @Author: Hjx * @Date: 2021/8/30 17:20 */ public class TestTriggerQuartz { public static void main(String[] args) throws SchedulerException { Date startDate = new Date(); long time = startDate.getTime() + 10000; Date endDate = new Date(time); // 1. 获取调度器 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 2. 获取JobDetail JobDetail jobDetail = JobBuilder.newJob(TestTriggerJob.class) .withIdentity("JobDetail", "JobDetailGroup") .build(); // 3. 获取trigger 每秒都执行一次任务 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("Trigger", "TriggerGroup") .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?")) .build(); // 4. 通过调度器绑定任务和触发器 scheduler.scheduleJob(jobDetail, trigger); //5. 启动 scheduler.start(); } } 运行结果: 触发器名称:Trigger 触发器组名称:TriggerGroup 开始时间:2021-08-30 18:23:44 触发器名称:Trigger 触发器组名称:TriggerGroup 开始时间:2021-08-30 18:23:44 ······
-
懒得写的可以找找在线的Cron表达式生成器,挺方便的