【发布时间】:2019-05-19 00:49:48
【问题描述】:
通常我会做这样的事情来安排一个作业在 Spring 中定期执行,并在给定的时区使用 cron:
@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。
【问题讨论】:
-
实际上,
subscribe()不会阻止您的线程。如果你真的需要,你可以调用stuff().subscribeOn(Schedulers.parallel()).subscribe()或其他调度程序来确保执行将在一个单独的线程中完成。 -
@AlexanderPankin 我相信你可以这样回答
标签: spring spring-boot cron spring-webflux project-reactor