Springboot + Quartz实现周期性间隔性定时任务
前言
在日常开发中,可能会遇到周期性间隔性的定时任务,本篇将以一个例子讲解其具体实现。
一、例子
1、例如:要实现喷泉在 2022 年 2 月 22 日 到 2022 年 3 月 30 日 的工作日(周一到周五)里,每天早上 0 点 5 分到下午 5 点 15 分期间,开启喷泉 10 秒钟后,再关闭喷泉 5 秒钟,再开启喷泉 10 秒钟,再关闭喷泉 5 秒钟……以此类推,无限循环
一、具体实现
1、引入 quartz
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2、编写定时任务具体业务逻辑实现类
public class TestJob implements Job {
/**
* 运行时间(秒)
*/
private Integer runSecond;
public void setRunSecond(Integer runSecond) {
this.runSecond = runSecond;
}
@Override
public void execute(JobExecutionContext context) {
// 获取定时任务名
String name = context.getJobDetail().getKey().getName();
// 创建线程池
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
// 延时 runSecond=10 秒后执行关闭设备操作
executorService.schedule(() -> {
// 此处实现具体关闭设备操作
System.out.println("定时任务 " + name + " 在 " + DateUtil.now() + " 执行了关闭设备操作");
executorService.shutdown();
}, runSecond, TimeUnit.SECONDS);
// 此处实现具体开启设备操作
System.out.println("定时任务 " + name + " 在 " + DateUtil.now() + " 执行了开启设备操作");
}
}
3、编写定时任务配置类
@Component
public class QuartzDemo implements ApplicationRunner {
@Autowired
private Scheduler scheduler;
@Override
public void run(ApplicationArguments args) throws Exception {
// jobDetail
JobDetail jobDetail = JobBuilder
.newJob(TestJob.class)
.withIdentity("jobName", "jobGroup")
.usingJobData("runSecond", 10)// 开启设备后停顿10秒钟
.build();
// 触发器
DailyTimeIntervalTrigger trigger = TriggerBuilder.newTrigger().withIdentity("triggerName", "triggerGroup")
.startAt(DateUtil.parseDateTime("2022-02-22 00:05:00"))// 开始日期 2022-02-22 00:05:00
.endAt(DateUtil.parseDateTime("2022-03-30 17:15:00"))// 关闭日期 2022-03-30 17:15:00
.withSchedule(DailyTimeIntervalScheduleBuilder.dailyTimeIntervalSchedule()
.startingDailyAt(TimeOfDay.hourMinuteAndSecondOfDay(0, 5, 0))// 每天 00:05:00 开始
.endingDailyAt(TimeOfDay.hourMinuteAndSecondOfDay(17, 15, 0))// 每天 17:15:00 结束
.onDaysOfTheWeek(2, 3, 4, 5, 6)// 每周一至周五执行任务,1表示星期日
.withIntervalInSeconds(10 + 5)//开启后停顿10秒,关闭,关闭后停顿5秒
.withMisfireHandlingInstructionDoNothing())// 禁止quartz在启动后会立即执行一次
.build();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
}
}
4、运行结果
总结
如果这篇博客对你有帮助的话,记得给我点个赞,你的鼓励是对我最大的支持!谢谢。◕‿◕。