![](/img/trans.png)
[英]Difference between Spring Async, Async with CompletableFuture and Java8 parallel stream
[英]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.