我有一个Spring启动控制器,可以进行两次服务调用。第二次通话应该在第一次通话得到回应后10秒后才会发生。
public SomeResponse myAction() {
res = serviceCallA();
waitFor(10) {
serviceCallB();
}
return res;
}
该操作不必等待来自serviceCallB()的响应,以返回响应。只需要在单独的线程中触发对serviceCallB()的调用。
最好的方法是什么?我需要类似ThreadPoolTaskExecutor的东西,但是有延迟。
示例代码真棒..
答案 0 :(得分:0)
非常简单的回答;
SomeResponse myAction() {
res = serviceCallA();
serviceCallB();
return res;
}
@Async
void serviceCallB() {
Thread.sleep(10000) // 10 secs
// do service B call stuff
}
More on @Async with Spring也this
请注意,因为这些调用将在新线程中运行这些serviceCallB()
逻辑,如果在没有适当控制的情况下使用,可能会导致内存问题。杀了你的服务器。
答案 1 :(得分:0)
使用承诺,而不是 1999 年那会浪费宝贵系统资源的可怕的 Thread.sleep
。您的选项是 CompletableFuture、RxJava Publisher constructs、Spring 自己的 Project Reactor。
让 serviceCallA
返回 Mono<Something>
(反应堆项目)。然后:
res.delayElement(Duration.ofSeconds(10))
.doOnEach(unused -> serviceCallB())
.block();
在每个库中可能有 6 种方法可以做到这一点,以上是一种。