Springboot quartz指定时间无延迟执行定时任务
1、三步快速开始
1、引入依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
<!-- springboot自动管理版本,不需要指定具体的版本,你也可以指定版本 -->
2、创建一个配置,启动定时任务,管理Scheduler对象
@Component
@Slf4j
public class QuartzSchedulerStarter implements CommandLineRunner {
private final Scheduler scheduler;
public QuartzSchedulerStarter(Scheduler scheduler) {
this.scheduler = scheduler;
}
@Override
public void run(String... args) throws Exception {
log.info("自定义定时任务开启");
scheduler.start();
}
}
3、启动
//我采用的是由前端创建生成的定时任务,可以指定时间上下架商品、或者某个活动自动更新价格、图片信息等(以前逢年过节甚至过年还要改价,科技就是用来解放双手的,这也是咱学计算机的意义!)
/**
* 1、 创建定时任务
*
* @param schedulerDto
* @return
*/
@PostMapping("/createSchedule")
public BaseResponse<String> createSchedule(@RequestBody SchedulerDto schedulerDto) {
try {
JobDetail jobDetail = JobBuilder.newJob(DemoJob.class)
.storeDurably()
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.forJob(jobDetail)
.startAt(schedulerDto.getSchedule()) // 设置任务开始时间
.build();
scheduler.scheduleJob(jobDetail, trigger);
return ResultUtils.success(null,"定时任务创建成功");
} catch (SchedulerException e) {
e.printStackTrace();
return ResultUtils.success(null,"定时任务创建失败");
}
}
//2、实体类
@Data
public class SchedulerDto {
/**
* 定时任务id
*/
private Long id;
/**
* 指定时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date schedule;
}
//3、自动执行的类,你只要实现Job 然后就可以自己写功能了。
@Slf4j
public class DemoJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
log.info(jobExecutionContext.getJobDetail().getDescription());
log.info("11");
}
}
注意:定时任务是放在内存上的,如果项目重启就会失效,如果需要持久化,持久化有官方的持久化,也可以自己写持久化,本次暂时只讨论指定时间完成指定任务的功能开发,下次更新持久化相关内容,喜欢可以点赞收藏。