使用spring scheduler重新安排任务

时间:2017-07-14 20:45:55

标签: spring cron spring-scheduled

我有一个spring scheduler,它有三个不同触发器的任务(cron触发器)。对于每个任务,我都有一个可以修改cron表达式的UI。我希望在服务收到更新请求时重新安排任务。下面是我的Scheduler configuratin。如何在运行时更改其中一个任务的计划(当UI发送请求以更新DB中的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 AM。现在,如果我现在更新cron以在第25分钟触发,我预计该任务将在上午11:25触发。但是使用上面的代码它会在上午11:40触发,然后在下午12:25触发。这不是我想要的行为。

1 个答案:

答案 0 :(得分:1)

我认为你有两个选择:

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

    @Autowired
    private ScheduledTaskRegistrar taskRegistrar;
    
    void runOnce() {
        taskRegistrar.scheduleCronTask(task);
    }