springboot动态修改cron创建定时任务

package com.init.webSocket.scheduler;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ContextLifecycleScheduledTaskRegistrar;
import org.springframework.scheduling.config.TriggerTask;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.Date;

/**
 * 动态修改cron创建定时任务
 *
 * @author hxy
 */
@Component
public class DynamicCronSchedule {
    private static Logger logger = LoggerFactory.getLogger(DynamicCronSchedule.class);
    private static ContextLifecycleScheduledTaskRegistrar taskRegistrar;
    private static String cron = "0 */1 * * * ?";

    public DynamicCronSchedule() {
        configureTasks();
    }

    /**
     * 赋值新的cron
     *
     * @param newCron
     */
    public static void setNewCron(String newCron) {
        cron = newCron;
        //调用执行
        configureTasks();
    }

    private static void configureTasks() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(3);
        scheduler.initialize();
        if (taskRegistrar != null) {
            taskRegistrar.destroy();
        }
        taskRegistrar = new ContextLifecycleScheduledTaskRegistrar();
        taskRegistrar.setScheduler(scheduler);
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // 任务逻辑
                System.out.println("dynamicCronTask is running..." + cron + new Date());
            }
        };
        Trigger trigger = new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                //修改配置
                CronTrigger trigger = new CronTrigger(cron);
                Date nextExec = trigger.nextExecutionTime(triggerContext);
                return nextExec;
            }
        };
        TriggerTask triggerTask = new TriggerTask(runnable, trigger);
        taskRegistrar.setTriggerTasksList(Arrays.asList(triggerTask));
        taskRegistrar.afterSingletonsInstantiated();
    }

}

public HttpResult settingSettlement(String settlementDateTime, HttpServletRequest request,
			HttpServletResponse response) throws ParseException {
		//替换执行
		DynamicCronSchedule.setNewCron("*/5 * * * * ?");
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用 Spring Boot 中的定时任务框架 `@Scheduled` 来实现动态定时任务。具体步骤如下: 1. 创建一个实体类,用于存储定时任务的相关信息,如任务名、Cron表达式等。 2. 创建一个数据库表,用于存储定时任务的相关信息。 3. 在 Spring Boot创建一个定时任务管理器,用于启动、停止和删除定时任务。 4. 使用 Spring Data JPA 或 MyBatis 等持久化框架,从数据库中读取定时任务的相关信息,并使用 `@Scheduled` 注解创建对应的定时任务。 5. 提供接口,允许用户通过 API 的方式添加、修改或删除定时任务。 下面是一个简单的示例: 1. 定义实体类: ```java @Entity public class Task { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String cron; // 省略Getter和Setter } ``` 2. 创建数据库表: ```sql CREATE TABLE `task` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `cron` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; ``` 3. 创建定时任务管理器: ```java @Component public class TaskScheduler { private static final Logger logger = LoggerFactory.getLogger(TaskScheduler.class); private final ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); public TaskScheduler() { scheduler.setThreadNamePrefix("task-thread-"); scheduler.setPoolSize(10); scheduler.initialize(); } public void scheduleTask(Task task) { logger.info("Schedule task: {}", task.getName()); scheduler.schedule(() -> { // TODO: 执行定时任务的代码 logger.info("Task executed: {}", task.getName()); }, new CronTrigger(task.getCron())); } public void cancelTask(Task task) { logger.info("Cancel task: {}", task.getName()); scheduler.getScheduledThreadPoolExecutor().getQueue().stream() .filter(taskScheduledFuture -> { Object taskToRun = taskScheduledFuture.getTask(); return taskToRun instanceof ScheduledMethodRunnable && ((ScheduledMethodRunnable) taskToRun).getMethod().getName().equals(task.getName()); }) .findFirst() .ifPresent(taskScheduledFuture -> taskScheduledFuture.cancel(true)); } } ``` 4. 使用 `@Scheduled` 注解创建定时任务: ```java @Service public class TaskService { private final TaskRepository taskRepository; private final TaskScheduler taskScheduler; public TaskService(TaskRepository taskRepository, TaskScheduler taskScheduler) { this.taskRepository = taskRepository; this.taskScheduler = taskScheduler; } @Scheduled(fixedRate = 5000) public void pollTasks() { List<Task> tasks = taskRepository.findAll(); for (Task task : tasks) { taskScheduler.scheduleTask(task); } } } ``` 5. 提供接口,允许用户操作定时任务。 参考资料: - [Spring Boot 定时任务的实现](https://www.jianshu.com/p/ce4784bb863c) - [Spring Boot 定时任务详解](https://www.jianshu.com/p/9f6e385a4a2e)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值