[英]Play Framework - balancing asynchronous and non-blocking
我正在尋找一個燈泡的時刻,但還沒有! 將Play Framework 2.5.9與Java 8結合使用,並嘗試遵循異步,非阻塞模型的良好實踐。
因此,我的play應用公開了REST服務。 對端點之一的GET請求將數據返回給客戶端。 為了檢索某些數據,我的REST服務又需要調用另一個服務。
通過使對另一個服務的調用異步且無阻塞,我無法在該服務的響應中將數據包含在該服務的響應中。
我想我希望從我的服務到其他服務的呼叫是同步的,但不會阻塞? 這樣,在我等待其他服務的響應時,可以釋放處理我的服務中的請求的線程以執行其他操作。 而且,我仍然可以將響應中的數據包含在對我的服務的響應中的其他服務中。 那正確嗎?
這是我當前的異步代碼(我不需要)和非阻塞代碼(我想要):
import play.libs.ws.WSClient;
import play.libs.ws.WSRequest;
import play.libs.ws.WSResponse;
//...........//
WSRequest request = ws.url(endpointUrl);
request.get()
.thenApply(WSResponse::asJson)
.thenAccept(
jsonResult -> {
System.out.println(new Date().toString() + " "+ jsonResult.get("blah").get("bluh"));
}
);
我希望jsonResult從jsonResult中提取數據並在對我的服務的響應中返回它。 意見表示贊賞。
異步播放流程操作。 所以隨時返回CompletionStage<Result>
從動作。
您需要更改thenAccept
到thenApply
和包裝你造成串new Date().toString() ...
到一個Result
:
public CompletionStage<Result> apiData(){
WSRequest request = ws.url(endpointUrl);
return request.get()
.thenApply(WSResponse::asJson)
.thenApply(
jsonResult -> {
return ok(new Date().toString() + " "+ jsonResult.get("blah").get("bluh"));
}
);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.