常见的本地定时写法如下:
@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;@Overridepublic 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 {@Autowiredprivate 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移到数据库中集中管理就不难了。