我在Sping Boot Web服务中安排了一个定期重复的任务(@EnableSceduling)。当该任务触发时,它调用注册对象的Runnable/run方法。在run方法中,我需要做工作,并且在工作完成之前不退出run方法。问题是,我有其他线程做其他工作,这是需要这个运行线程的工作。所以在run thread中,我有这样的东西:
@Component
public class DoWork implements Runnable {
@override
public void run() {
// Setup clients.
// Call services.
Mono<String> response1 = client1.post();
response1.subscribe(new MyResponseCallback(), new MyErrorCallback());
Mono<String> response2 = client2.post();
response2.subscribe(new MyResponseCallback(), new MyErrorCallback());
Mono<String> responseX = clientX.post();
responseX.subscribe(new MyResponseCallback(), new MyErrorCallback());
while(callbacksWorkCompletedFlag == false) {
Thread.sleep (1000);
}
// Do computation with callback responses.
// After computation is completed, exit run method.
}
}
public class MyResponseCallback implements Consumer<String> {
@override
public void accept (final Sting response) {
// Do work with response.
}
}
public class MyErrorCallback implements Consumer<Throwable> {
@override
public void accept (final Throwable error) {
// Log error.
}
}
在Java/Sping Boot 中有更好的方法吗?
2条答案
按热度按时间dpiehjr41#
下面是一个使用
CompletableFuture
的示例。它使用Mono.subscribe
的第三个参数来让未来知道它何时完成。下面是一个
CountDownLatch
的例子:另一个
CompletableFuture
示例:所有的回调都是必需的吗?
vh0rcniy2#
你正在使用响应式编程,但忘记这一点,并试图解决它势在必行。你不需要睡觉,而是利用Project Reactor的功能。
您可以使用
zip
将不同Mono
的结果组合在一起,然后map
将结果转换为您需要的结果。无需检查boolean
使用倒计时锁存器等。你在
Consumer
中做了什么有点不清楚,但是你可以在每个Mono
上使用map
(或者如果只是设置布尔值,你可以删除它们)。