簡體   English   中英

播放2.2操作未與Web服務響應處理程序並行處理

[英]Play 2.2 action not processed in parallel with web service response handler

public class Application extends Controller {

    @BodyParser.Of(BodyParser.Json.class)
    public static Result action1() {
        WS.url(WS_URL).get().map(new Function<WS.Response, Result>() {
            public Result apply(WS.Response response) {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return null;
            }
        });
        return ok();
    }

    @BodyParser.Of(BodyParser.Json.class)
    public static Result action2() {
        return ok();
    }
}

客戶端首先調用action1() ,然后調用action2() 但是,似乎Play在那10秒之后處理了第二個請求。 我認為來自Web服務的響應是由Play在單獨的線程中處理的,但事實並非如此。 在這種情況下,如果我想休眠或在超時后執行一些代碼而不中斷服務器處理其他請求,該怎么辦?

編輯:當來自WS的響應在客戶端調用action2()之前到達時,就會發生這種情況。

默認情況下,Play分配的線程數與您擁有的CPU內核數相同(盡管請注意,有多個線程池),因此,如果您要執行阻塞操作(例如在處理程序中進行sleep ),請將其配置為分配更多的線程。

不太確定您要實現的目標,但是下面的代碼將在WS調用返回與返回正常結果之間插入10秒的延遲:

public static F.Promise<SimpleResult> action1() {
    return WS.url(WS_URL).get().flatMap(new Function<WS.Response, F.Promise<WS.Response>>() {
        public F.Promise<WS.Response> apply(WS.Response response) {
           return F.Promise.timeout(response, 100000);
        }
    }).map(new Function<WS.Response, SimpleResult>() {
        public SimpleResult apply(WS.Response response) {
           return ok();
        }
    };
}

要了解Play的線程池,請閱讀以下內容:

http://www.playframework.com/documentation/2.2.x/ThreadPools

要了解Play如何實現承諾,請閱讀以下內容:

http://www.playframework.com/documentation/2.2.x/JavaAsync

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM