2013-05-02 94 views
1

雖然在Servlet 3.0規範有request.startAsync()asyncContext.start(), 爲什麼它沒有提供asyncContext.stop()asyncContext.cancel()在服務器端啓動必要的清理?爲什麼沒有asyncContext.cancel()

請在此其他question的環境中查看此信息以瞭解我來自哪裏。

  • 一個HTTP請求開始異步處理,並返回一個 .../outstandingRequests /的requestId鏈接到客戶端。
  • 另一HTTP請求呼叫DELETE該鏈路上以取消該請求

在這種情況下,如果我有一種方法來清理服務器端(servlet容器東西一樣AsyncListeners),而不是必須請撥打asyncContext.complete()這可能會嘗試並將響應發送回客戶端,這是有道理的。不是嗎?

回答

2

在這種情況下,呼叫1仍然掛在那裏,等待呼叫2進入時的響應,並且想要殺死它。在這種情況下,爲什麼你不想在呼叫1上打電話complete(),從而完成該呼叫以便客戶端停止等待?在這種情況下,您可能希望將狀態代碼設置爲200以外的值,但complete似乎也是所有場景中的最佳選項,因爲它將控制權返回給原始調用方並執行任何與請求相關的清理工作。

當超時發生時,這是一個錯誤,容器調用complete(帶有我想象的非200響應代碼)。你描述的場景類似於超時(雖然是強制超時),所以爲什麼不做同樣的事情容器呢。只需調用像這樣調用complete前:

ac.getResponse().setStatus(500); 

任何可能寫點東西描述是什麼原因導致這個錯誤輸出流。

+0

我很擔心在取消的情況下調用complete()的副作用:「在創建AsyncContext的ServletRequest中註冊的AsyncListener類型的任何偵聽器都將在其onComplete方法中調用。」如果聽者在哪裏認爲這是成功完成(微不足道的例子:增加一個SuccessfulRequestsHandled計數器),我會遇到麻煩。感覺像超載完成()有很多意義! – brainOverflow 2013-05-03 19:56:15

+0

onComplete調用需要一個允許您訪問HttpServletResponse的AsyncEvent。在您的監聽器中,您可以檢查狀態代碼,並在非200狀態下采取相應措施。您還可以構建一個抽象偵聽器類,該類封裝此檢查並委派給onError,而不是200狀態碼。然後,讓所有自定義偵聽器都從這個擴展。 – cmbaxter 2013-05-03 20:02:41

+0

這是一個可行的解決方案!但它仍然是一個解決方法!我想,如果我們擴展這個參數,AsyncListener可以只使用一個回調方法,比如說onComplete(),然後要求程序員設置適當的狀態碼,並確定它是超時,錯誤還是成功或取消!它可以消除onTimeout()和onError()!我誠實地感覺到Async Servlet規範沒有花太多時間考慮取消! – brainOverflow 2013-05-03 20:16:20

-1

ac.getResponse()。setStatus(500);不起作用嗎?

+0

應該是一個評論而不是答案 – TheCodingFrog 2015-06-29 15:32:27