方式1
cron表达式
scheduletask:
cron: 0/5 * * * * ?
定时任务
@Data
@Component
public class ScheduleTask implements SchedulingConfigurer {
@Value("${scheduletask.cron}")
private String cron;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(() -> System.out.println("Current time:"+ LocalDateTime.now()), triggerContext -> {
CronTrigger cronTrigger = new CronTrigger(cron);
return cronTrigger.nextExecutionTime(triggerContext);
});
}
}
修改Cron接口
@Api(tags = "定时任务管理")
@RestController
@RequestMapping("/schedule")
@Slf4j
public class ScheduleController {
@Autowired
private ScheduleTask scheduleTask;
@GetMapping("/updateCron")
public String updateCron(String cron) {
log.info("new cron :{}", cron);
scheduleTask.setCron(cron);
return "ok";
}
}
执行效果
除了上面的借助cron表达式的方法,还有另一种触发器,区别于CronTrigger触发器,该触发器可随意设置循环间隔时间,不像cron表达式只能定义小于等于间隔59秒。
方式2
private Long timer = 10000L;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// 动态使用cron表达式设置循环间隔
taskRegistrar.addTriggerTask(() -> System.out.println("Current time: "+LocalDateTime.now()), triggerContext -> {
// 使用不同的触发器,为设置循环时间的关键,区别于CronTrigger触发器,该触发器可随意设置循环间隔时间,单位为毫秒
PeriodicTrigger periodicTrigger = new PeriodicTrigger(timer);
return periodicTrigger.nextExecutionTime(triggerContext);
});
}
@GetMapping("/updateTimer")
public String updateTimer(Long timer) {
log.info("new timer :{}", timer);
scheduleTask.setTimer(timer);
return "ok";
}