java 动态添加Scheduled

举报
8181暴风雪 发表于 2025/01/21 19:48:04 2025/01/21
【摘要】 在Java中,动态添加​​@Scheduled​​​任务通常涉及到Spring的​​TaskScheduler​​​接口和​​ScheduledExecutorService​​。以下是一个示例,展示了如何在运行时动态添加和删除定时任务。1. 创建Spring Boot项目首先,确保你的Spring Boot项目中已经添加了​​spring-boot-starter​​​和​​spring-...

在Java中,动态添加​​@Scheduled​​​任务通常涉及到Spring的​​TaskScheduler​​​接口和​​ScheduledExecutorService​​。以下是一个示例,展示了如何在运行时动态添加和删除定时任务。

1. 创建Spring Boot项目

首先,确保你的Spring Boot项目中已经添加了​​spring-boot-starter​​​和​​spring-boot-starter-web​​依赖。

2. 配置​​TaskScheduler​

在Spring配置类中配置​​TaskScheduler​​:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

@Configuration
public class SchedulerConfig {

    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);
        scheduler.setThreadNamePrefix("MyScheduler-");
        scheduler.setDaemon(true);
        return scheduler;
    }
}

3. 创建动态任务管理器

创建一个类来管理动态添加和删除的任务:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;

@Service
public class DynamicTaskService {

    @Autowired
    private TaskScheduler taskScheduler;

    private final Map<String, ScheduledFuture<?>> scheduledTasks = new HashMap<>();

    public void addTask(String taskId, Runnable task, String cronExpression) {
        ScheduledFuture<?> future = taskScheduler.schedule(task, new CronTrigger(cronExpression));
        scheduledTasks.put(taskId, future);
    }

    public void removeTask(String taskId) {
        ScheduledFuture<?> future = scheduledTasks.get(taskId);
        if (future != null) {
            future.cancel(true);
            scheduledTasks.remove(taskId);
        }
    }
}

4. 创建一个示例任务

创建一个简单的任务类:

import org.springframework.stereotype.Component;

@Component
public class SampleTask implements Runnable {

    private String taskId;

    public SampleTask(String taskId) {
        this.taskId = taskId;
    }

    @Override
    public void run() {
        System.out.println("Executing task: " + taskId + " at " + System.currentTimeMillis());
    }
}

5. 创建控制器来管理任务

创建一个REST控制器来动态添加和删除任务:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/tasks")
public class TaskController {

    @Autowired
    private DynamicTaskService dynamicTaskService;

    @PostMapping
    public String addTask(@RequestParam String taskId, @RequestParam String cronExpression) {
        SampleTask task = new SampleTask(taskId);
        dynamicTaskService.addTask(taskId, task, cronExpression);
        return "Task added: " + taskId;
    }

    @DeleteMapping("/{taskId}")
    public String removeTask(@PathVariable String taskId) {
        dynamicTaskService.removeTask(taskId);
        return "Task removed: " + taskId;
    }
}

6. 启动Spring Boot应用

启动你的Spring Boot应用,并使用HTTP请求来动态添加和删除任务。

示例请求

  • 添加任务:
curl -X POST "http://localhost:8080/tasks?taskId=myTask1&cronExpression=0/10 * * * * ?"
  • 删除任务:
curl -X DELETE "http://localhost:8080/tasks/myTask1"

关键点

  • TaskScheduler​​: 使用Spring的​​TaskScheduler​​接口来调度任务。
  • CronTrigger​​: 使用​​CronTrigger​​来定义任务的执行频率。
  • ScheduledFuture​​: 使用​​ScheduledFuture​​来管理任务的执行状态,并支持取消任务。

通过以上步骤,你可以在Spring Boot应用中动态地添加和删除定时任务,提供了灵活的任务管理能力。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。