通过数据库动态配置cron执行定时任务
在java中我们一般实现简单的定时任务可以通过@Scheduled注解以及配置cron表达式来实现。但这种方式的缺点是,是静态的,是单线程的。当有多个任务运行的时候,可能该任务会受到其他任务的影响。此时。我们可以使用基于接口实现的定时任务,也就是基于接口SchedulingConfigurer。我们可以把任务的cron配置在数据库中,会根据修改后的表达式动态变更执行此任务的时间,步骤如下。
1.首先启动类要加上@EnableScheduling注解。
2.在数据中,建相对应的表,如图。
3.代码实现,如下。
@Configuration
@Component
@Slf4j
public class SchedulingTask implements SchedulingConfigurer {
@Autowired
private TaskConfigService taskConfigService;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.addTriggerTask(() -> {
// 定时任务要执行的内容
log.info("【-----开始执行定时任务-----】");
/**
* 中间就是写具体的业务逻辑
*/
// 定时任务结束
log.info("【---------------结束定时任务-------------】");
}, triggerContext -> {
// 定时任务触发,可修改定时任务的执行周期 根据数据库动态查询
TaskConfig cron = taskConfigService.getOne(new LambdaQueryWrapper<TaskConfig>().eq(TaskConfig::getCode, "cron"));
CronTrigger trigger = new CronTrigger(cron.getCron());
return trigger.nextExecutionTime(triggerContext);
});
}
}
4.实现效果
我们现在的表达式"0/10 * * * * ?",即10秒执行一次,如图。
我们直接修改数据库配置,现在是"0/5 * * * * ?",五秒执行一次,如图。
实现效果,定时任务会动态的根据cron执行任务任务,如图。
其本质,其实是通过修改了我们的系统时间来进行实现的。