实现定时任务有多种方式,使用spring自带的,继承SchedulingConfigurer的方式。
一、实现
1、启动类
在启动类添加注解@EnableScheduling开启,不然不起用做。
@EnableScheduling
@SpringBootApplication
public class TansciApplication {
public static void main(String[] args) {
SpringApplication.run(TansciApplication.class, args);
}
}
2、新建任务类
添加注解@Component注册到spring的容器中。
package com.tansci.common.task;
import com.tansci.common.constant.Constants;
import com.tansci.domain.system.TaskConfig;
import com.tansci.service.system.TaskContextService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.CronTask;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.PreDestroy;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledFuture;
/**
* @ClassName: ScheduledTask.java
* @ClassPath: com.tansci.common.task.ScheduledTask.java
* @Description: 定时任务
* @Author: tanyp
* @Date: 2022/2/25 9:30
**/
@Slf4j
@Component
public class ScheduledTask implements SchedulingConfigurer {
private volatile ScheduledTaskRegistrar registrar;
private final ConcurrentHashMap<String, ScheduledFuture<?>> scheduledFutures = new ConcurrentHashMap<>();
private final ConcurrentHashMap<String, CronTask> cronTasks = new ConcurrentHashMap<>();
@Autowired
private TaskContextService taskContextService;
@Override
public void configureTasks(ScheduledTaskRegistrar registrar) {
registrar.setScheduler(Executors.newScheduledThreadPool(Constants.DEFAULT_THREAD_POOL));
this.registrar = registrar;
}
@PreDestroy
public void destroy() {
this.registrar.destroy();
}
/**
* @MonthName: refreshTask
* @Description: 初始化任务
* 1、从数据库获取执行任务的集合【TaskConfig】
* 2、通过调用 【refresh】 方法刷新任务列表
* 3、每次数据库中的任务发生变化后重新执行【1、2】
* @Author: tanyp
* @Date: 2022/2/25 9:42
* @Param: [tasks]
* @return: void
**/
public void refreshTask(List<TaskConfig> tasks) {
// 删除已经取消任务
scheduledFutures.keySet().forEach(key -> {
if (Objects.isNull(tasks) || tasks.size() == 0) {
scheduledFutures.get

本文介绍如何使用Spring框架实现动态定时任务,包括启动类配置、任务类实现、自启动任务配置、实体类定义、动态调用任务配置信息、任务注册器实现及cron表达式解析。通过实例展示了动态刷新任务列表的过程。
最低0.47元/天 解锁文章
1867





