Планирование периодических реактивных задач в Spring с помощью cron? - PullRequest
0 голосов
/ 18 декабря 2018

Обычно я делал бы что-то подобное, чтобы запланировать выполнение задания в Spring периодически с cron в заданном часовом поясе:

@Scheduled(cron = "0 0 10 * * *", zone = "Europe/Stockholm")
public void scheduleStuff() {
    // Do stuff
}

Это будет блокировать поток, вызывающий scheduleStuff, пока задание не будет выполнено.завершено.Однако в этом случае все «вещи», которые я хочу сделать, реализованы с использованием неблокирующих строительных блоков Springs проектный реактор (то есть Mono, Flux и т. Д.).

Например, скажем, я хочу периодически запускать эту функцию:

Flux<Void> stuff() {
    return ..
}

Конечно, я могу просто вызвать stuff().subscribe() (или даже stuff().block()), но это заблокирует поток.Есть ли лучший способ добиться того же, что и @Scheduled(cron = "0 0 10 * * *", zone = "Europe/Stockholm") для неблокирующего кода?

Я использую Spring Boot 2.1.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

На самом деле, subscribe() не блокирует вашу ветку.Вы можете вызвать stuff().subscribeOn(Schedulers.parallel()).subscribe() или другой планировщик, чтобы убедиться, что выполнение будет выполняться в отдельном потоке, если вам это действительно нужно.

0 голосов
/ 18 декабря 2018

Вы можете заключить метод stuff в асинхронный метод

Пример:

@Scheduled(cron = "0 0 10 * * *", zone = "Europe/Stockholm")
public void scheduleStuff() {
    stuffService.doStuffAsync();
}

Служба с асинхронным методом

public class StuffService() implements IStuffService {

    @Async
    public void doStuffAsync() {
       // Call and subscribe to your flux method here
    }

}

Вызов doStuffAsync() немедленно вернет scheduleStuff, чтобы не блокировать поток.

...