Spring 延迟执行一段代码

ash*_*ipj 6 spring-boot

我有一个 Spring Boot 控制器,它进行两次服务调用。第二个调用应该只在 10 秒后发生,在从第一个调用得到响应后。

public SomeResponse myAction() {
    res = serviceCallA();
    waitFor(10) {
        serviceCallB();
    }
    return res;
}
Run Code Online (Sandbox Code Playgroud)

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

实现这一点的最佳方法是什么?我需要类似 ThreadPoolTask​​Executor 的东西,但有延迟。

示例代码会很棒..

bur*_*ete 1

非常直接的答案;

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

@Async
void serviceCallB() {
  Thread.sleep(10000) // 10 secs
  // do service B call stuff
}
Run Code Online (Sandbox Code Playgroud)

更多关于 @Async with Spring 的信息还有这个

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

  • 这意味着线程在整个 10 秒内被消耗(即从线程池中获取)。 (5认同)
  • 直接 - 不解释警告 - 可能非常危险。 (2认同)