2017-09-11 35 views
0

故事在於,我們有一個由Tomcat + Apache Httpd作爲前端託管的webapp。 Web應用程序需要很長時間來處理某個REST請求(查詢數據庫很長時間,然後在獲得數據庫響應後生成摘要)。如何在Tomcat中正常地終止長查詢REST請求

在當前的實現中,即使REST客戶端停止請求,查詢仍然在處理,直到數據庫查詢完成並且嘗試發送迴應並發現輸出流已關閉。另一方面,webapp不會在很長時間內發回任何東西,導致Apache Httpd會話超時(我們將超時配置爲5分鐘)。

那麼,什麼是最好的做法,以實現以下目標:

  • 如果客戶終止請求,我想請求的處理停止,和查詢數據庫終止爲好。

  • 如果請求沒有被客戶端終止但是查詢已經花了很長時間,Tomcat可以發送過早的響應。

    更新:我想服務器可能會發回100繼續,但我錯了。看起來像100繼續並不打算爲此目的。

我想到一個模型是這樣的:

  • 介紹一個小服務程序過濾器來接受REST請求。
  • 過濾器創建另一個線程來異步調用目標REST,從而提供輸出流。
  • 過濾器會定期進行一些睡眠並檢查新線程的輸出流,並不時發回100個連續的數據流,或者將輸出流的結果流式傳輸到客戶端。

這是可行的,或者任何其他更好的方法?

+0

見https://stackoverflow.com/a/21529531/227491 – Peter

+0

此外https://stackoverflow.com/questions/2962196/detecting-client-disconnect-in-tomcat-servlet – Peter

+0

@Peter感謝,但它看起來像這些答案不能滿足我的需要。此外,我需要補充的是,webapp並不是由我們開發的,我們不想改變REST處理邏輯中的邏輯來檢查輸出流。 –

回答

2

長時間運行請求的另一種方法是讓服務器返回301重定向到URL,在服務器處理完成後請求輸出將被髮布。然後,客戶可以通過GET URL來檢查請求的狀態。

This 2011 post by Thijssen描述了一種更優雅的異步Web請求(使用202和303 HTTP狀態代碼)的RESTful方法,但在一天結束時,您需要Web客戶端和服務器都知道細節;我不知道任何一個通用支持的處理長時間運行的REST API調用的標準。

+0

你能解釋一下更多的detali嗎?看起來你正在建議類似異步請求的東西。你的意思是服務器不斷爲重定向的URL生成一些東西,直到結果準備就緒? –

+0

是的。長時間運行的API調用通常是一個糟糕的想法。這篇博文有關於如何實現替代品的一些更完善的想法(例如,使用202個響應來表明資源正在準備中,但尚未準備好訪問):https://farazdagi.com/2014/rest-and -long-running-jobs/ – Peter

+0

謝謝。這將是一個好方法。不幸的是,底層應用程序根本不受控制,而且它也需要很多改變。 –

相關問題