2011-05-07 32 views
3

我正在研究一個可能需要幾個小時才能完成請求的servlet。但是,調用servlet的客戶端只關心該請求是否已被servlet接收。客戶端在從servlet獲得任何響應之前不想等待數小時。另外,由於調用servlet是一個阻塞調用,客戶端只有在收到來自servlet的響應之後才能繼續。 爲了避免這種情況,我正在考慮在servlet代碼中實際啓動一個新線程。由servlet啓動的線程將執行耗時的處理,從而允許servlet非常快速地向客戶端返回響應。但我不確定這是否是一種解決servlet調用阻塞性質的可接受方法。我已經看過NIO,但它似乎並不能保證在任何servlet容器中工作,因爲servlet容器也是基於NIO的。Threading in Servlets

回答

2

您的解決方案是正確的,但在企業應用程序中創建線程被認爲是不好的做法。最好使用thread pool或JMS隊列。

你必須考慮在處理過程中服務器應該發生什麼情況,如何在多個請求(想:數百甚至數千)同時發生時作出反應等等。所以你選擇了正確的方向,但是它有點複雜。

2

一個線程並不壞,但我建議把它作爲一個任務扔到執行程序池中。更好的是長期工作的經理。按計劃快速返回並不是一種壞習慣。我建議提供某種用戶反饋,指出用戶可以在哪裏找到有關長時間運行作業的信息。所以:

  1. 創建代表了一個獨特的ID
  2. 的工作任務將作業發送到你的後臺處理程序對象(即包含的遺囑執行人)
  3. 建立唯一的作業ID的URL的工作。
  4. 返回描述那裏他們可以得到的結果

頁,結果將與這樣的背景下作業管理器來協調頁面。在計算時,您可以在此頁面上描述進度。完成後,該頁面可以顯示長時間運行作業的結果。

4

您需要的是作業調度程序,因爲他們保證即使在重新啓動服務器時也能完成作業。

看看java OSS job schedulers,最值得注意的是Quartz