планировщик проверки доступности Spring

avatar
WBLord
1 июля 2021 в 20:53
45
1
0

Мне нужно отправить запрос на сайт и получить данные, но они могут быть не готовы. Я думал решить эту проблему через @Scheduled. Но проблема в том, что после успешного получения я должен перестать запрашивать. Это правильный подход? Если да, то как завершить @Scheduled задачу

@Scheduled(fixedRate = 5000)
    public void reportCurrentTime() {
        ResponseEntity<String> response
  = restTemplate.getForEntity(Url , String.class);
}
Источник
WBLord
3 июля 2021 в 13:12
0

@Mukit09 У меня возникла следующая проблема. У меня может быть несколько экземпляров задачи. Эта задача может быть у каждого пользователя. Ваш вариант вроде убивает все задачи сразу?

Mukit09
3 июля 2021 в 14:39
0

Планировщик настроен на фиксированную скорость, как код вашего вопроса? Не могу понять, как это может быть мудрым пользователем. Что вы имеете в виду под пользователем? Это необходимо проработать. @WBLord

Ответы (1)

avatar
Mukit09
1 июля 2021 в 21:53
2

Да, можно. Вы можете использовать ScheduledAnnotationBeanPostProcessor. Получив ответ об успешном выполнении, вы можете вызвать метод класса postProcessBeforeDestruction(). Вот пример:

public class Scheduler {

    private final ScheduledAnnotationBeanPostProcessor processor;
    private final ApplicationContext context;

    @Autowired
    public Scheduler(ScheduledAnnotationBeanPostProcessor processor, ApplicationContext context) {
        this.processor = processor;
        this.context = context;
    }

    @Scheduled(fixedRate = 5000)
    public void doSchedule() {
        Random random = new Random();
        final int i = random.nextInt() % 5;
        // here you will put your logic to call the the stopScheduler()
        if (i == 3) {
            stopScheduler();
        }
    }

    private void stopScheduler() {
        Scheduler bean = context.getBean(Scheduler.class);
        processor.postProcessBeforeDestruction(bean, "someString");
        log.debug("Scheduler closed!");
    }
}