繁体   English   中英

Java8 - CompletableFuture - 在异步调用中按顺序运行方法

[英]Java8 - CompletableFuture - Running methods in async call sequentially

所以我有这个代码块:

 someMethod(SomeParameter someParameter) {
  for (SomeObject: object) {
    if (someObject is true) {
      callSomeMethod(someParameter);
    } else {
      callSomeMethodInstead(someParameter);
    }
  }
}

callSomeMethod(SomeParameter someParameter) {
  someObjectdataFromDb = getFromDB(someId);
  boolean checker = checkIfNull(someObjectdataFromDb ) || checkIfHasCertainStatus(someObjectdataFromDb );
  if (checker) {
    callAnExternalAPI(someParameter);
  }
}

然后它被异步调用:

CompletableFuture.runAsync{()->{someMethod(someParameter);}}

现在,问题在于拥有外部 API 的团队告诉我们,我们同时对它们进行多次调用,从而导致创建数据时出现一些问题。 有没有一种方法可以确保callSomeMethod上发生的代码是按顺序发生的?

编辑:读到 ForkJoinPool 有一个工作窃取算法,这可能是问题的原因吗?

读到 ForkJoinPool 有一个工作窃取算法,这可能是问题的原因吗?

怀疑它,任何类型的线程池都允许同时执行多个线程池。

如果您需要确保它一次只被调用一次,您可以使callSomeMethod同步(假设它是 static 或 singleton 对象)。 请注意,这意味着事情会无限期地阻塞,因此请确保您在与外部服务的交互中有适当的超时。

如果您有更复杂的需求,例如可以允许一些有限的并发性(比如一次最多 3 个很好,但没有更多或类似的),或者正在寻找超时,我建议使用弹性 4j 隔板,我用过为此目的相当成功。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM