前言
请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、
提示:以下是本篇文章正文内容,下面案例可供参考
业务需求:
基于配置方式将:定时任务执行时间、其它配置进行可配置处理。当添加新的配置项时,系统会在启动时自动创建对应的定时任务。
当然这一点可以:基于Quartz实现通过接口创建任务,但是不希望依赖数据库的同时又不想硬编码处理!
解决方案:
可以利用 Spring的SchedulingConfigurer 接口来动态注册定时任务,能够灵活地根据配置文件的变化来调整定时任务。
要实现根据配置文件动态创建定时任务的功能,可以按照以下步骤实现:
一、创建配置文件
application.yml 配置如下:
file-path-map:
300510:
- D:\WorkFile\test2\striker #输入路径
- D:\WorkFile\test2\strikerOut\TEST_ZhuDai #输出路径
- D:\WorkFile\test7\hosts.txt #hosts文件路径
- TEST_ZhuDai #业务类型
- msg_data_40001000 #消息主题
- platformloan_test_decision_result #业务结果主题
- "0 0/1 * * * ?" #间隔1分钟执行一次
300511:
- D:\WorkFile\test5\striker
- D:\WorkFile\test6\strikerOut\TEST_LianHeDai
- D:\WorkFile\test7\hosts.txt
- TEST_LianHeDai
- msg_data_40001000
- platformloan_app_decision_result
- "0 0/5 * * * ?" #间隔5分钟执行一次
注意事项:
-
确保配置中的cron表达式是合法的
-
每个任务配置必须有7个参数,最后一个必须是cron表达式
-
如果需要更复杂的任务管理,可以考虑使用数据库存储配置
二、创建配置类
首先创建一个配置类来映射配置文件中的内容:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@Component
@ConfigurationProperties(prefix = "file-path-map")
public class FilePathConfig {
private Map<String, List<String>> filePathMap = new LinkedHashMap<>();
public Map<String, List<String>> getFilePathMap() {
return filePathMap;
}
public void setFilePathMap(Map<String, List<String>> filePathMap) {
this.filePathMap = filePathMap;
}
}
三、创建定时任务调度器
创建一个定时任务调度器,用于动态注册和管理定时任务:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Configuration
public class DynamicSchedulerConfig implements SchedulingConfigurer {
@Autowired
private FilePathConfig filePathConfig;
private final Map<String, ScheduledTaskRegistrar> taskRegistrars = new ConcurrentHashMap<>();
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// 初始加载配置
refreshTasks();
}
public void refreshTasks() {
// 清除所有现有任务
taskRegistrars.values().forEach(ScheduledTaskRegistrar::destroy);
taskRegistrars.clear();
// 从配置中获取所有任务配置
Map<String, List<String>> configMap = filePathConfig.getFilePathMap();
if (configMap != null) {
configMap.forEach((taskId, configList) -> {
if (configList.size() >= 7) {
String cronExpression = configList.get(6);
ScheduledTaskRegistrar registrar = new ScheduledTaskRegistrar();
registrar.addTriggerTask(
// 任务内容
() -> executeTask(taskId, configList),
// 触发器
triggerContext -> new CronTrigger(cronExpression).nextExecutionTime(triggerContext)
);
registrar.afterPropertiesSet();
taskRegistrars.put(taskId, registrar);
}
});
}
}
private void executeTask(String taskId, List<String> config) {
// 这里实现具体的任务逻辑
System.out.println("Executing task " + taskId + " with config: " + config);
// 可以根据config中的各个参数执行具体业务
// config.get(0) - 输入路径
// config.get(1) - 输出路径
// config.get(2) - hosts文件路径
// config.get(3) - 业务类型
// config.get(4) - 消息主题
// config.get(5) - 业务结果主题
}
}
四、创建配置监听器(可选)
如果需要实现配置文件变更时自动刷新定时任务,可以添加 配置变更监听
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
@Configuration
@RefreshScope
public class ConfigChangeListener {
@Autowired
private DynamicSchedulerConfig dynamicSchedulerConfig;
@PostConstruct
public void init() {
// 初始加载后刷新一次
dynamicSchedulerConfig.refreshTasks();
}
// 如果使用Spring Cloud Config,可以添加以下方法
// @EventListener(EnvironmentChangeEvent.class)
public void onConfigChange() {
dynamicSchedulerConfig.refreshTasks();
}
}
解释说明:
-
当添加新的配置项时
(如300512),系统会在启动时自动创建对应的定时任务 -
每个任务的执行逻辑在
executeTask方法中实现 -
如果需要动态刷新配置(不重启应用),可以使用Spring Cloud Config或手动调用refreshTasks()方法
总结
我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!
1125

被折叠的 条评论
为什么被折叠?



