Trigger
Trigger 是触发器,用来告诉调度程序作业什么时候触发
触发器通用属性
JobKey: Job 实例的标识,触发器被触发时,指定的 job 实例会执行
StartTime:触发器的时间表首次被触发的时间,类型是 Java.util.Date
EndTime:触发器不再被触发的时间 Java.util.Date
设置部分代码
// 获取3秒后的时间 Date startDate = new Date(); startDate.setTime(startDate.getTime() + 3000); // 获取6秒后的时间 Date endDate = new Date(); endDate.setTime(endDate.getTime() + 3000); // 创建Trigger Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startAt(startDate) .endAt(endDate) .usingJobData("name", "trigger") .withSchedule(scheduleBuilder) .build();
Job 中获取 Trigger 数据
package timer; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.Trigger; import java.text.SimpleDateFormat; public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Trigger trigger = jobExecutionContext.getTrigger(); // 获取开始时间和结束时间 System.out.println(dateFormat.format(trigger.getStartTime())); System.out.println(dateFormat.format(trigger.getEndTime())); // 获取JobKey System.out.println(trigger.getJobKey().getName()); System.out.println(trigger.getJobKey().getGroup()); } }
SimpleTrigger
指定时间段内执行一次作业任务
或者在指定的时间间隔内多次执行作业任务
任务
package timer; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.text.SimpleDateFormat; import java.util.Date; public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(dateFormat.format(new Date())); } }
示例 1
// 获取3秒后的时间 Date startDate = new Date(); startDate.setTime(startDate.getTime() + 3000); // 3秒钟之后执行一次 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startAt(startDate) .build();
示例 2
// 获取3秒后的时间 Date startDate = new Date(); startDate.setTime(startDate.getTime() + 3000); // 每2s执行一次,无限循环 SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(2) .withRepeatCount(3); // 3s之后执行第一次,之后每隔2s执行一次,重复3次 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startAt(startDate) .withSchedule(scheduleBuilder) .build();
示例 3
// 获取3秒后的时间 Date startDate = new Date(); startDate.setTime(startDate.getTime() + 3000L); // 获取6秒后的时间 Date endDate = new Date(); endDate.setTime(endDate.getTime() + 6000L); // 每2s执行一次,无限循环 SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder .simpleSchedule() .withIntervalInSeconds(2) .withRepeatCount(3); // 3s之后执行第一次,之后每隔2s执行一次,6秒之后结束 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startAt(startDate) .endAt(endDate) .withSchedule(scheduleBuilder) .build();
注意:
- 重复次数可以为 0、正整数、SimpleTrigger.REPEAT_INDEFINITELY
- 重复执行间隔必须为 0 或长整数
- 一旦执行了 endTime 参数,那么会覆盖重复次数参数的效果
CronTrigger
基于日历的作业调度器,而不是像 SimpleTrigger 那样精确指定时间间隔,较为常用
格式:
秒 分 时 日 月 周 年
特殊符号说明
, 或 10,12 - 区间 10-12 / 每 */5 * 所有值 * ? 不指定
提示
- L 和 W 可以组合使用
- 周字段不区分大小写 mon 与 MON 相同
- 利用在线生成工具
示例
// 每2秒执行一次 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("*/2 * * * * ? *")) .build();