故事在於,我們有一個由Tomcat + Apache Httpd作爲前端託管的webapp。 Web應用程序需要很長時間來處理某個REST請求(查詢數據庫很長時間,然後在獲得數據庫響應後生成摘要)。如何在Tomcat中正常地終止長查詢REST請求
在當前的實現中,即使REST客戶端停止請求,查詢仍然在處理,直到數據庫查詢完成並且嘗試發送迴應並發現輸出流已關閉。另一方面,webapp不會在很長時間內發回任何東西,導致Apache Httpd會話超時(我們將超時配置爲5分鐘)。
那麼,什麼是最好的做法,以實現以下目標:
如果客戶終止請求,我想請求的處理停止,和查詢數據庫終止爲好。
如果請求沒有被客戶端終止但是查詢已經花了很長時間,Tomcat可以發送過早的響應。
更新:我想服務器可能會發回100繼續,但我錯了。看起來像100繼續並不打算爲此目的。
我想到一個模型是這樣的:
- 介紹一個小服務程序過濾器來接受REST請求。
- 過濾器創建另一個線程來異步調用目標REST,從而提供輸出流。
- 過濾器會定期進行一些睡眠並檢查新線程的輸出流,並不時發回100個連續的數據流,或者將輸出流的結果流式傳輸到客戶端。
這是可行的,或者任何其他更好的方法?
見https://stackoverflow.com/a/21529531/227491 – Peter
此外https://stackoverflow.com/questions/2962196/detecting-client-disconnect-in-tomcat-servlet – Peter
@Peter感謝,但它看起來像這些答案不能滿足我的需要。此外,我需要補充的是,webapp並不是由我們開發的,我們不想改變REST處理邏輯中的邏輯來檢查輸出流。 –