动态注册定时任务 我会了你呢?


前言

请各大网友尊重本人原创知识分享,谨记本人博客:南国以南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分钟执行一次

注意事项:

  1. 确保配置中的cron表达式是合法的

  2. 每个任务配置必须有7个参数,最后一个必须是cron表达式

  3. 如果需要更复杂的任务管理,可以考虑使用数据库存储配置

二、创建配置类

首先创建一个配置类来映射配置文件中的内容:

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();
    }
}

解释说明:

  1. 当添加新的配置项时(如300512),系统会在启动时自动创建对应的定时任务

  2. 每个任务的执行逻辑在executeTask方法中实现

  3. 如果需要动态刷新配置(不重启应用),可以使用Spring Cloud Config或手动调用refreshTasks()方法


总结

我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南国以南i

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值