簡體   English   中英

在所有異步請求中設置默認超時

[英]Set default timeout in all asynchronous requests

我在我的請求中使用@Suspended AsyncResponse response並啟動線程來處理請求。 當進程完成時,我正在嘗試恢復響應,但RestEasy正在將請求標記為已完成,因為請求線程已完成且響應中未設置超時。 如果我設置超時,它工作正常,但我需要在我想要實現的每個異步請求中設置超時。 無論如何都要將超時水平設置為我所有掛起的AsyncRequests?

遺憾的是, JAX-RS 2.0規范RESTEasy文檔Jersey文檔沒有提及有關為AsyncResponse設置默認超時的任何信息。

Jersey文檔提到了以下內容:

默認情況下,掛起的AsyncResponse實例上沒有定義超時。 可以使用setTimeoutHandler(TimeoutHandler)setTimeout(long, TimeUnit)方法定義自定義超時和超時事件處理程序。 setTimeoutHandler(TimeoutHandler)方法定義在達到超時時將調用的處理程序。 處理程序使用響應代碼503 (來自Response.Status.SERVICE_UNAVAILABLE )恢復Response.Status.SERVICE_UNAVAILABLE 還可以定義超時間隔,而無需指定自定義超時處理程序(僅使用setTimeout(long, TimeUnit)方法)。

因此,解決方案與您已使用的解決方案沒有區別:

@GET
public void longRunningOperation(@Suspended final AsyncResponse asyncResponse) {

    // Register a timeout handler
    asyncResponse.setTimeoutHandler(new TimeoutHandler() {

        @Override
        public void handleTimeout(AsyncResponse asyncResponse) {
            asyncResponse.resume(Response.status(SERVICE_UNAVAILABLE)
                .entity("Operation timed out. Please try again.").build());
        }
    });

    // Set timeout
    asyncResponse.setTimeout(15, SECONDS);

    // Execute long running operation in new thread
    executor.execute(new Runnable() {

        @Override
        public void run() {
            executeLongRunningOp();
            asyncResponse.resume("Hello async world!");
        } 
    });
}

暫無
暫無

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

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