簡體   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