2016-03-01 34 views
1

我如何使用閱讀此頁,Spring的異步調用: https://spring.io/guides/gs/async-method/使用Spring的未來<Entity>和異步註釋

這源於幾個設計問題:

1)你隱藏的抽象背後異步功能,或者你直接使用它們?

2)在上面的示例鏈接中,如果每個異步調用已返回,代碼都會有一個「while循環」檢查每個10ms。有沒有其他的方法來實現這個,然後是一個持續的「while」循環? :)不覺得效率很高...

謝謝!

回答

0

回答第2個問題:Java未來接口只有兩種方法:get()阻止異步請求,直到完成; isDone()檢查結果是否準備好顯示。不幸的是,他們之間沒有橋樑 - 你無法收到一個事件或另一個觸發你的事件,那個任務已經計算完畢。

Java 8介紹了名爲CompletableFuture的mechanizm。

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html

從文檔:

甲未來可明確地完成(其值設置和 狀態),並且可以被用作CompletionStage,支持依賴 功能和操作該扳機完成後。

補充教程這裏:http://www.nurkiewicz.com/2013/05/java-8-definitive-guide-to.html

0

1)根據我的經驗,異步功能直接使用。客戶需要知道響應不是立即可用的,所以他們可以利用API等待一個響應。這導致...

2)輪詢。不,它效率不高。但它是處理異步通信的常用方法。另一種方法是回調或基於事件的機制,但我沒有看到在ReST API中實現的機制。

  • 請注意,HTTP旨在支持輪詢。在異步操作的情況下,服務器將返回202(接受)。 202響應的主體可能包含指向另一個端點的鏈接,該鏈接可用於狀態更新的輪詢。狀態檢查端點將在異步處理完成時返回303(或同時爲404)。
+0

對不起,我其實有點不清楚。因此,客戶呼叫服務。服務業務邏輯組件異步並行地執行對後端系統的多個調用。這就是爲什麼我想知道是否應該有一個循環來檢查所有異步調用已返回,然後再返回到調用客戶端。 – user1340582

+0

聽起來您可能正在尋找[ExecutorService](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html)。 – jaco0646