[英]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.