簡體   English   中英

在容器中管理線程池的最佳實踐是什么?

[英]What is the best practice for managing thread pools in a container?

我需要能夠在一個容器中完成兩個線程任務,並且需要了解執行此操作的最佳實踐。 這是我需要完成的兩類任務:

  1. 在Web服務調用期間,我需要啟動一個線程,該線程在發送響應后繼續進行處理。 處理完成后,無需將任何消息發送回原始發件人。
  2. Web服務調用可能需要派生多個需要彼此並行運行的線程。 在所有工人完成之前,應阻止對原始請求的響應。 響應的元素將從每個線程結果的片段中提取。

當然,我可以創建自己的java.util.concurrent.Executor實例並使用它,但是我懷疑容器可能足夠聰明以提供它們所管理的容器。

FWIW-我在JDK 1.5.0上使用WebSphere 6.1(我知道,很古老...但這就是它的意思)。 我正在運行使用Apache CXF開發的Web服務,因此我在servlet容器中,但已使用Spring配置。

對於1),您可能想要查看異步Bean。 或者,使用消息驅動Bean來拾取並操作發送到隊列的消息。 您可能也想看看Spring的Quartz東西。 我認為使用Servlet 3(在WAS 6.1上沒有機會!),如果沒有Async Work Manager或JMS方法,您可能會獲得異步支持,但是直到那時,我還不知道有什么比這些模式更好的方法。

對於2),通常阻止請求是一項冒險的業務(如果您超時)。 但是,您位於servlet容器中,因此可以使用java.util.concurrent中的內容,例如您提到的ExecutorService。 或者,使用消息傳遞將工作發送到其他地方並阻塞直到完成。

通常,我不會從容器內部啟動線程,因為有可能打開j2ee完全合規性,並且您的應用程序將死亡。 在完全合規的情況下,不允許創建線程。 您想要做的是設置一個JMS隊列,然后將“要完成的工作”提交給該隊列。 然后,您可以讓MDB監聽隊列,該隊列執行線程將執行的實際操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM