Spring在延迟后执行一段代码

时间:2017-04-06 14:07:47

标签: spring-boot

我有一个Spring启动控制器,可以进行两次服务调用。第二次通话应该在第一次通话得到回应后10秒后才会发生。

public SomeResponse myAction() {
    res = serviceCallA();
    waitFor(10) {
        serviceCallB();
    }
    return res;
}

该操作不必等待来自serviceCallB()的响应,以返回响应。只需要在单独的线程中触发对serviceCallB()的调用。

最好的方法是什么?我需要类似ThreadPoolTask​​Executor的东西,但是有延迟。

示例代码真棒..

2 个答案:

答案 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 Springthis

请注意,因为这些调用将在新线程中运行这些serviceCallB()逻辑,如果在没有适当控制的情况下使用,可能会导致内存问题。杀了你的服务器。

答案 1 :(得分:0)

使用承诺,而不是 1999 年那会浪费宝贵系统资源的可怕的 Thread.sleep。您的选项是 CompletableFutureRxJava Publisher constructs、Spring 自己的 Project Reactor

serviceCallA 返回 Mono<Something>(反应堆项目)。然后:

res.delayElement(Duration.ofSeconds(10))
  .doOnEach(unused -> serviceCallB())
  .block();

在每个库中可能有 6 种方法可以做到这一点,以上是一种。