изменение времени выполнения @scheduled cron выражений без перезапуска приложения - PullRequest
0 голосов
/ 03 сентября 2018

Я использовал запланированную аннотацию, чтобы запланировать выполнение задачи чтения крон из БД. Но когда мы изменяем выражение cron с помощью пользовательского интерфейса, оно должно перезапустить приложение. Как внедрить TaskScheduler и ScheduledFuture или любой другой подход к перепланированию без перезапуска при обновлении пользователя из пользовательского интерфейса, который вызовет этот метод updateTestJobSchedule. Любой пример в соответствии с приведенным ниже кодом будет очень полезным.

В настоящее время у меня есть: -

@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 голосов
/ 03 сентября 2018

Лучше всего использовать объект TaskScheduler. Bean-компонент taskScheduler создается автоматически, если у вас есть @EnableScheduling для класса, помеченного @Configuration. Этот объект можно использовать для планирования работы на лету. Вот быстрый пример того, что вы можете сделать с ним:

@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);
    }
}

Возможно, вам потребуется сохранить объект ScheduledFuture, возвращаемый методом расписания, чтобы иметь возможность отменить задание в какой-то момент. Также вам потребуется служба, использующая TaskScheduler, чтобы вы могли планировать работу при вызове updateTestJobSchedule.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...