常见的本地定时写法如下:
@Scheduled(cron = "0/5 * * * * ?")
private void test() {
log.info("业务处理逻辑。。。5秒一次");
}
如果想要动态更新cron表达式,可以这样写:
先写一个类,让cron表达式总是读成员变量的值。
再写一个controller,通过调用set方法就可以动态设置这个cron表达式了
@Lazy(false)
@Component
@EnableScheduling
public class SpringDynamicCornTask implements SchedulingConfigurer {
private static final Logger logger = LoggerFactory.getLogger(SpringDynamicCornTask.class);
private static final String DEFAULT_CRON = "0/5 * * * * ?";
private String cron = DEFAULT_CRON;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(() -> {
logger.info("真正的任务执行逻辑。。。");
}, triggerContext -> {
CronTrigger trigger = new CronTrigger(cron);
return trigger.nextExecutionTime(triggerContext);
});
}
public void setCron(String cron) {
System.out.println("原来的cron:"+this.cron+"更新后的cron:"+cron);
this.cron = cron;
}
public String getCron() {
return this.cron;
}
}
@RestController
public class TestController {
@Autowired
private SpringDynamicCornTask springDynamicCornTask;
@RequestMapping("/setCron")
public String setCron(){
springDynamicCornTask.setCron("0/10 * * * * ?");
return "success";
}
@RequestMapping("/getCron")
public String getCron(){
String cron = springDynamicCornTask.getCron();
return "cron:"+cron;
}
}
直接调用这个/setCron,就可以将cron从5秒一次改为10秒一次。
当然,在这个基础上把cron移到数据库中集中管理就不难了。