2011-05-17 129 views
1

我需要能夠在一個容器中實現兩個線程任務,並且需要了解執行此操作的最佳實踐。以下是我需要完成的兩類任務:管理容器中線程池的最佳做法是什麼?

  1. 在Web服務調用期間,我需要啓動一個線程,在響應發送後繼續處理。處理完成後,不需要將任何消息發回給原始發件人。
  2. Web服務調用可能需要產生多個需要並行運行的線程。應該阻止對原始請求的回覆,直到所有工作人員完成。響應的元素將從每個線程的結果中抽取出來。

當然,我可以創建我自己的一個java.util.concurrent.Executor的實例,並使用它,但我懷疑容器可能是足夠聰明,提供一個他們所管理。我正在JDK 1.5.0上使用WebSphere 6.1(我知道,古老的......但它就是這樣)。我正在運行使用Apache CXF開發的Web服務,所以我在servlet容器中,但是使用Spring進行配置。

+0

相關:http://stackoverflow.com/questions/5357033/background-timer-task-in-jsp-web-application/5357856#5357856答案最終歸結爲:「取決於容器,閱讀它的文檔/手冊」。您可能希望將您的問題重新構建爲「如何利用WebSphere託管線程池?」如果您無法破譯IBM文檔。 – BalusC 2011-05-17 21:53:30

回答

1

對於1)你可能想看看Asynchronous Beans。或者,使用消息驅動Bean來提取並操作發送給隊列的消息。還有來自Spring的Quartz,你可能也想看看。我認爲,使用Servlet 3(在WAS 6.1上沒有機會!),您可能會獲得異步支持而不使用異步工作管理器或JMS方法,但在此之前,我不知道比這些模式更好的方法。

對於2)通常阻止請求是一個有風險的業務(如果你超時)。然而,你在servlet容器中,所以你可以使用java.util.concurrent中的某些東西,例如正如你所提到的那樣,ExecutorService。或者使用消息傳遞將作品發送到其他地方並阻止,直到完成。

+0

編輯的問題,包括我的更多細節(重新:EJB容器等)。 – Jared 2011-05-17 21:35:46

+0

謝謝 - 我用我所知道的更新了答案。 – planetjones 2011-05-17 21:44:53

+0

asynchbeans是應用程序創建的異步工作所支持的WebSphere機制。 – 2011-05-17 21:59:02

0

通常,我不會從容器內部啓動線程,因爲有可能j2ee完全合規性打開並且您的應用程序會死亡。在完全符合線程不允許創建。你想要做的是建立一個JMS隊列,提交你的「待完成的工作」。然後,您可以有一個MDB監聽隊列,該隊列執行您的線程完成的實際操作。

相關問題