Spring在延迟后执行代码块

amrnrhlw  于 2022-11-23  发布在  Spring
关注(0)|答案(3)|浏览(140)

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

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

这个动作不需要等待serviceCallB()的响应,只需要在单独的线程中触发serviceCallB()的调用就可以了。
什么是实现这一点的最佳方式?我需要类似ThreadPoolTaskExecutor的东西,但有延迟。
示例代码会很棒..

fnvucqvd

fnvucqvd1#

很直白的回答;

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

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

也是
但是要小心,因为这些调用将在新线程中运行这些serviceCallB()逻辑,如果没有适当的控制,可能会导致内存问题和杀死您的服务器。

06odsfpq

06odsfpq2#

使用一个承诺,而不是1999年的可怕的Thread.sleep,它浪费了宝贵的系统资源。
serviceCallA返回Mono<Something>(项目React堆),则:

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

在每个库中,可能有6种方法来实现这一点,以上就是其中之一。

gmxoilav

gmxoilav3#

使用java.util.concurrent包,您可以获得执行程序

ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor();
ex.schedule(() -> serviceCallB, 10, TimeUnit.SECONDS);

相关问题