SpringBoot JAVA 动态设置定时任务执行时间

本文介绍了一种使用Spring框架实现的定时任务服务,该服务允许通过动态修改Cron表达式来调整任务的执行频率。文章提供了核心代码示例,展示了如何创建一个可以被Spring容器管理的定时任务,并通过修改Cron表达式来改变任务的执行间隔。

一 .核心代码 

@Component
@EnableScheduling
public class ScheduleService implements SchedulingConfigurer {
    private String cron = "*/5 * * * * *";


    private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        //方法1 动态使用cron表达式设置循环间隔
        taskRegistrar.addTriggerTask(new Runnable() {

            @Override
            public void run() {
                System.out.println(format.format(new Date()) + "============1111111111111111111111========="+cron);
            }
        }, new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                //此处使用CronTrigger触发器,可动态修改cron表达式来操作循环规则,
                //但是具体使用受制于cron表达式的规范,不能做到随心所欲设置循环间隔时间
                CronTrigger cronTrigger = new CronTrigger(cron);
                Date nextExecutionTime = cronTrigger.nextExecutionTime(triggerContext);
                return nextExecutionTime;
            }
        });
    }

    public String getCron() {
        return cron;
    }

    public void setCron(String cron) {
        this.cron = cron;
    }


    public SimpleDateFormat getFormat() {
        return format;
    }

    public void setFormat(SimpleDateFormat format) {
        this.format = format;
    }


}

二.调用 修改执行时间

    @Autowired
    private ScheduleService scheduleService;

    @Override
    public Boolean setOpinionRemind(String i) {
        if(i.equals("1")){
            scheduleService.setCron("*/20 * * * * *");
        }
        return null;
    }

在Spring Boot项目中实现定时任务动态配置,主要依赖于`SchedulingConfigurer`接口和`TaskScheduler`的使用。这种方式允许根据运行时参数动态地添加、修改或删除定时任务。以下是一个完整的实现方法。 ### 动态配置定时任务的核心实现 1. **定义任务存储结构** 首先,需要一个存储结构来保存任务信息,例如任务的`Runnable`、执行周期等。可以使用一个`Map`来存储任务信息: ```java private final Map<String, ScheduledFuture<?>> taskMap = new ConcurrentHashMap<>(); ``` 2. **实现 `SchedulingConfigurer` 接口** 通过实现该接口,可以动态注册定时任务。示例代码如下: ```java @Configuration @EnableScheduling public class DynamicSchedulingConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5)); // 设置任务线程池 } } ``` 3. **动态任务管理类** 创建一个服务类来管理任务的动态添加、移除等操作: ```java @Service public class DynamicTaskService { @Autowired private TaskScheduler taskScheduler; private final Map<String, ScheduledFuture<?>> taskMap = new ConcurrentHashMap<>(); public void addTask(String taskId, Runnable task, long initialDelay, long period) { if (taskMap.containsKey(taskId)) { removeTask(taskId); } ScheduledFuture<?> future = taskScheduler.scheduleAtFixedRate(task, initialDelay, period); taskMap.put(taskId, future); } public void removeTask(String taskId) { ScheduledFuture<?> future = taskMap.remove(taskId); if (future != null) { future.cancel(true); } } public void shutdown() { for (ScheduledFuture<?> future : taskMap.values()) { future.cancel(true); } taskMap.clear(); } } ``` 4. **任务执行逻辑** 在业务逻辑中,可以将需要执行的`Runnable`封装为任务,并通过`DynamicTaskService`动态添加。例如: ```java @Service public class ReportTask { @Autowired private DynamicTaskService dynamicTaskService; public void scheduleDailyReport(long initialDelay, long period) { String taskId = "dailyReport"; Runnable task = () -> { // 执行日报生成逻辑 System.out.println("Generating daily report..."); }; dynamicTaskService.addTask(taskId, task, initialDelay, period); } } ``` 5. **任务配置** 可以通过数据库、配置文件或外部API动态获取任务的执行周期和参数,从而实现完全动态的任务配置。 ### 动态任务的生命周期管理 - **任务启动**:通过`scheduleAtFixedRate`或`scheduleWithFixedDelay`方法启动任务。 - **任务移除**:调用`removeTask`方法取消指定任务。 - **任务关闭**:在应用关闭时,调用`shutdown`方法确保所有任务正确终止。 ### 示例:动态配置任务周期 假设需要根据用户输入动态配置任务周期,可以结合`@RestController`实现一个简单的任务控制接口: ```java @RestController @RequestMapping("/tasks") public class TaskController { @Autowired private DynamicTaskService dynamicTaskService; @PostMapping("/add") public ResponseEntity<String> addTask(@RequestParam String taskId, @RequestParam long initialDelay, @RequestParam long period) { Runnable task = () -> System.out.println("Executing task: " + taskId); dynamicTaskService.addTask(taskId, task, initialDelay, period); return ResponseEntity.ok("Task added: " + taskId); } @PostMapping("/remove") public ResponseEntity<String> removeTask(@RequestParam String taskId) { dynamicTaskService.removeTask(taskId); return ResponseEntity.ok("Task removed: " + taskId); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值