使用cron计划Spring中的周期性反应性任务?

时间:2018-12-18 15:01:03

标签: spring spring-boot cron spring-webflux project-reactor

通常,我会执行以下操作来安排要在给定时区中使用cron在Spring中定期执行的作业:

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

这将阻塞调用scheduleStuff的线程,直到作业完成。但是,在这种情况下,我想做的“东西”都是使用Springs的project reactor(即MonoFlux等)的非阻塞构建块来实现的。

例如假设我要定期触发此功能:

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

我当然可以简单地调用stuff().subscribe()(甚至是stuff().block()),但这会阻塞线程。对于非阻塞代码,是否有更好的方法来实现与@Scheduled(cron = "0 0 10 * * *", zone = "Europe/Stockholm")相同的功能?

我正在使用Spring Boot 2.1。

2 个答案:

答案 0 :(得分:4)

实际上,subscribe()不会阻塞您的线程。您可以调用stuff().subscribeOn(Schedulers.parallel()).subscribe()或其他调度程序,以确保如果确实需要执行,将在单独的线程中完成。

答案 1 :(得分:1)

您可以将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
    }

}

stuff()的调用将立即返回scheduleStuff,因此不会阻塞线程。