通常,我会执行以下操作来安排要在给定时区中使用cron在Spring中定期执行的作业:
@Scheduled(cron = "0 0 10 * * *", zone = "Europe/Stockholm")
public void scheduleStuff() {
// Do stuff
}
这将阻塞调用scheduleStuff
的线程,直到作业完成。但是,在这种情况下,我想做的“东西”都是使用Springs的project reactor(即Mono
,Flux
等)的非阻塞构建块来实现的。
例如假设我要定期触发此功能:
Flux<Void> stuff() {
return ..
}
我当然可以简单地调用stuff().subscribe()
(甚至是stuff().block()
),但这会阻塞线程。对于非阻塞代码,是否有更好的方法来实现与@Scheduled(cron = "0 0 10 * * *", zone = "Europe/Stockholm")
相同的功能?
我正在使用Spring Boot 2.1。
答案 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
,因此不会阻塞线程。