2012-02-01 114 views
0

我有一個servlet,它需要幾分鐘的處理,並返回其響應。它運行在一個有限的環境中(Amazon Elastic Beanstalk)。在此環境中,請求時間有60秒的限制,並且不可配置。Java Servlet的連接超時

我在這裏有什麼選擇?我想讓servlet啓動一個線程並讓瀏覽器使用AJAX進行輪詢,但是我看到很多人推薦使用servlet來由於各種原因啓動線程。

另一種解決辦法是有一個線程啓動,並在應用程序上下文監聽結束了,但我在執行各種功能的應用程序許多不同的servlet,它們都具有相同的問題。在後臺運行的單個線程不會真的有幫助。

有什麼建議嗎?

編輯:隨着越來越多的研究,在那麼一點點,我發現一個Executor 正是我需要的。

See BalusC's answer here

See skaffman's answer here

回答

0

解決此問題的最佳方法是使用Executor(請參閱我的問題中的更新)。我在我的項目中使用了它,並且它可以無縫工作。

1

是的,這是不啓動線程programmaticaly到小服務程序容器中的最佳實踐。但是這個限制並不是那麼嚴格。恕我直言,你可以做到這一點,如果你真的需要。但是如果你開始這樣的解決方案一步一步實施。

首先只是嘗試,如果這個工程。打開新線程處理您的長時間請求。在處理它時,從servlet的「main」線程發送某種「保持活動」。處理完成後,向客戶端發送響應。

也許更好和更可擴展的解決方案是使用消息傳遞(例如,JMS)爲長的請求異步處理。當收到請求時,servlet應該創建JMS消息,將其排入隊列並立即返回。另一方(實現MessageListener)應處理消息並將結果放入傳出隊列中。客戶端應該從這個隊列中請求結果。這是一個明確的解決方案,它可以在集羣和多機環境下工作,但需要更多努力。

所以,你的選擇應取決於您的需求,資源和時間。

+0

+1爲徹底的響應和JMS。但是,我正在尋找的答案與Executor類似(請參閱我的問題的編輯)。謝謝。 – stepanian 2012-02-01 09:39:56

+0

@stepanian,執行者並不神奇。它使用線程池,這意味着您間接創建不受您的servlet容器管理的線程。 – AlexR 2012-02-01 10:43:54