通过数据库动态配置cron执行定时任务

669 阅读1分钟

通过数据库动态配置cron执行定时任务

在java中我们一般实现简单的定时任务可以通过@Scheduled注解以及配置cron表达式来实现。但这种方式的缺点是,是静态的,是单线程的。当有多个任务运行的时候,可能该任务会受到其他任务的影响。此时。我们可以使用基于接口实现的定时任务,也就是基于接口SchedulingConfigurer。我们可以把任务的cron配置在数据库中,会根据修改后的表达式动态变更执行此任务的时间,步骤如下。

1.首先启动类要加上@EnableScheduling注解。

2.在数据中,建相对应的表,如图。

image.png

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秒执行一次,如图。

image.png

我们直接修改数据库配置,现在是"0/5 * * * * ?",五秒执行一次,如图。

image.png

实现效果,定时任务会动态的根据cron执行任务任务,如图。

image.png

其本质,其实是通过修改了我们的系统时间来进行实现的。

image.png