运行时无需重新启动应用即可重新计划@scheduled cron表达式

时间:2018-09-03 15:01:35

标签: java spring spring-boot quartz-scheduler

我已使用计划注释来计划从db读取cronexpression的任务。但是,当我们使用UI更改cron表达式时,它需要重新启动应用程序。当用户从UI调用此方法TaskScheduler进行更新时,如何注入ScheduledFutureupdateTestJobSchedule或任何其他方法来重新调度而不重新启动。以下代码中的任何示例都将非常有帮助。

目前我有:-

@Configuration
public class BasicConfig {

@Autowired
private TestJobSchedulerRepository testJobSchedulerRepository;

@Bean
public String getCronExpressionFromDb(){
    return testJobSchedulerRepository.findByIsActive(1).getCronExpression();
 }
}

@RestController
@EnableScheduling
@RequestMapping("/api")
public class TestJobController {


    @Scheduled(cron="#{getCronExpressionFromDb}")
    public void doTestJob(){
      // does the job
    }

    // This update cron expression when request comes from UI

  @RequestMapping(value = "/update-testjob-schedule_application",
  method = RequestMethod.POST,
  produces = MediaType.APPLICATION_JSON_VALUE)
   public ResponseEntity<String> updateTestJobSchedule(@RequestBody 
   TestJobScheduler testJobScheduler) throws URISyntaxException {

        if(testJobScheduler.getIsActive() == 0){
            testJobScheduler.setIsActive(1);
        } else{
            testJobScheduler.setIsActive(0);
        }
        testJobSchedulerRepository.save(testJobScheduler);
    return new ResponseEntity<>("{\"status\":\"success\"}", HttpStatus.OK);
}

}

1 个答案:

答案 0 :(得分:0)

您最好的选择是使用TaskScheduler对象。当您在@EnableScheduling注释的类上有@Configuration时,会自动创建taskScheduler bean。该对象可用于即时调度作业。这里是您可以使用它的一个快速示例:

@Configuration
@EnableScheduling
public class CronJobConfiguration implements CommandLineRunner {

    @Autowired
    private TestJobSchedulerRepository testJobSchedulerRepository;

    @Autowired
    private TaskScheduler taskScheduler;

    @Override
    public void run(String... strings) {
        String cronExpression = testJobSchedulerRepository.findByIsActive(1).getCronExpression();
        Trigger trigger = new CronTrigger(cronExpression);
        ScheduledFuture scheduledFuture = taskScheduler
                .schedule(() -> {/* the job you want to run*/}, trigger);

        /* Keep the scheduledFuture to be able to cancel the job later Ex : */
        scheduledFuture.cancel(true);
    }
}

您可能需要保留schedule方法返回的ScheduledFuture对象,以便能够在某个时候取消作业。另外,您还需要具有使用TaskScheduler的服务,以便可以在调用updateTestJobSchedule时安排作业。