2012-02-14 27 views
3

我有一個創建Daemon線程負載的應用程序,我希望每個應用程序關閉時關閉它。Websphere是否尊重守護程序線程?

我有點擔心,認爲Websphere 7可能不會把它們全部關閉。

有誰知道Websphere 7是否以不同的方式處理守護進程線程? (我知道它應該這樣做)

注意: 我知道不應該手動創建線程,並且我應該使用WebSphere WorkManager或其他東西,但是此應用必須在Tomcat和WebSphere中運行。

我知道我應該將所有線程綁定到一些上下文/關閉機制,這是正在進行中。

+0

你是在管理你的線程,還是通過'ThreadPool'拉動線程? – 2012-02-14 09:22:54

回答

4

每個WAS服務器都運行一個JVM,守護進程線程與JVM的生命週期相關,而不是應用程序的生命週期。因此,當應用程序停止時,不應期望任何守護線程被關閉。

正如您已經指出的,您不應手動創建線程; Java EE規範禁止這樣做,並且Java EE容器中的行爲與您已經發現的獨立Java應用程序不同。不幸的是,目前沒有用於WorkManager等效的Java EE標準;但是,JSR-236(適用於Java EE的併發實用程序)可能會作爲列入Java EE 7的候選項。

與此同時,在WAS上,您可以使用asynchronous beansWorkManager)。我們已成功使用此方法將線程綁定到應用程序生命週期。

但是,因爲你需要在另一個容器以及(Tomcat)的,可能有一些其他的選擇運行考慮您的應用程序處理併發:

處理同時發生的一些其他潛在選項rency包括以下內容,但這些都需要EJB的,這可能不是在Tomcat中可用:

這裏是併發的話題一些相關的線程在Java EE中:

0

Websphere只是一個Java應用程序。它不能尊重或不尊重作爲JVM或Java運行時環境功能的deamon線程。因此,如果您在Java EE應用程序中創建deamon線程,那麼它將在每個應用程序服務器中都是deamon。

此外,據我所知,即使您創建常規線程,它也不會阻止應用程序服務器關閉:每個應用程序服務器的關閉機制嘗試關閉其所有組件,並在最後運行System.exit()以贏得犯罪分子: )手動打開線程。

+0

我想他說的只是關閉一個應用程序,而不是整個容器。在這種情況下,線程不會自動終止。 – 2012-02-14 15:55:07

1

正如已經提到的你不應該這樣做,但沒有一個好的方法來做到這一點。這對我沒有造成任何問題。

該方法需要集中創建線程並使用偵聽器在應用停止時終止線程。

你必須做幾件事情:

  1. 集中到一個類中的所有線程創建(稱之爲ThreadService)。當在這裏創建一個線程時,將它放在一個列表中,以便稍後可以遍歷列表來停止它們。
  2. 製作一個您的線程實現的接口,允許您通過相同的接口停止每個線程。你擁有的每個線程都必須實現它自己的處理機制。例如,如果您的線程使用循環和Thread.sleep(),則設置stopped = true並中斷該線程。當停止=真時,循環應該檢查並斷開循環。
  3. 創建一個監聽器並實現ServletContextListener。當contextDestroyed()被調用時調用ThreadService.stopThreads()。在web.xml中註冊這個監聽器。