gpt4 book ai didi

spring - 使用 Spring Scheduler 重新安排任务

转载 作者:行者123 更新时间:2023-12-02 13:03:32 25 4
gpt4 key购买 nike

我有一个 spring 调度程序,它具有三个具有不同触发器(cron 触发器)的任务。对于每一个任务,我都有一个可以修改 cron 表达式的 UI。我想在服务收到更新请求时重新安排任务。以下是我的调度程序配置。如何在运行时更改其中一项任务的计划(当 UI 发送更新数据库中的 cron 表达式的请求时)。使用以下方法,调度程序仅更新下一个调度。即当调用触发器时,会调用 nextExecutionTime() 方法。

@Configuration
@EnableScheduling
public class Config implements SchedulingConfigurer {

@Inject
MyDao db;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10);
taskScheduler.initialize();
taskRegistrar.setTaskScheduler(taskScheduler);

List<TaskConfig> conf = db.readTaks();
conf.forEach((TaskConfig aTask) -> {
taskRegistrar.addTriggerTask(new Runnable() {
@Override
public void run() {
System.out.println("Running task + " + aTask.getName());
}
}, new Trigger() {
@Override
public Date nextExecutionTime(final TriggerContext triggerContext) {
String expression = aTask.getCronExpression();
CronTrigger trigger = new CronTrigger(expression);
Date nextExec = trigger.nextExecutionTime(triggerContext);
return nextExec;
}
});
});
}
}

编辑:例如。考虑我的 cron 表达式设置为最初在每小时的第 40 分钟触发,当前时间为上午 11:20。现在,如果我现在将 cron 更新为在第 25 分钟触发,我预计该任务将在上午 11:25 触发。但使用上面的代码,它会在上午 11:40 触发,然后在中午 12:25 触发。这不是我想要的行为。

最佳答案

我认为你有两个选择:

  1. 刷新上下文;假设您更新了数据库,以便 db.readTaks() 返回更新后的计划,这将起作用。
  2. 添加一个具有新时间的触发器,以执行一次。这可以通过注入(inject) ScheduledTaskRegistrar 并添加上午 11:25 的触发器(如您的示例中所示)来完成。这是一个粗略的例子:

    @Autowired
    private ScheduledTaskRegistrar taskRegistrar;

    void runOnce() {
    taskRegistrar.scheduleCronTask(task);
    }

关于spring - 使用 Spring Scheduler 重新安排任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45111357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com