2011-06-07 102 views
4

我可以從MDB內啓動/產生新的Java線程嗎? 我有要求從MDB中的代碼做一些並行處理,然後將控制權返回給MDB。在消息驅動Bean(MDB)中產生新的Java線程

要求: 消息來MDB,那麼一些的代碼的處理。然後啓動兩個新的從屬線程來完成一些並行工作。直到那時,MDB正在等待。當線程完成工作。然後控制返回到MDB,完成相關的最終/清理工作。

這是好主意,開始從MDB一個新的線程(可運行)?如果不是,那麼應該是什麼選擇?

+0

我的問題是:什麼是你想要做的並行(由兩個從屬線程)的實際工作?另外,消息是並行處理的,不是嗎? – bpgergo 2011-06-07 14:19:51

+0

@bpgergo。我有一個單獨的第三方處理器類。我想在單獨的線程中使用這個類。只要將這個主MDB視爲普通的java類,只是從JMS獲取消息的手段,然後再作爲POJO。計劃Java應用程序是否需要啓動多個線程? – 2011-06-07 14:35:15

回答

1

開始與MDB是不好的做法,新的線程。它會工作,但新線程不能控制應用程序容器,因此可能會出現不可預測的行爲。他們甚至可能弄亂容器試圖維護的線程管理。如果應用程序部署在羣集中,則最大的影響是用戶定義的線程將失敗。

在您的情況:不是啓動新的線程,創造新的MDB與線程的邏輯(這樣,它會被contaner現在進行管理),然後將消息發送到這些新的MDB。如果你想讓控制權回到父MDB,那麼我認爲,在全局事務中使用你的父母MDB,以便父母MDB將等待孩子的MDB完成並且控制將返回。

2

如果您在線程中執行事務性工作,這是一個壞主意。

當前在EJB容器啓動的事務執行工作線程,與事務上下文關聯。在你的情況下,MDB中的onMessage方法啓動一個新的事務(除非你指定了一個NotSupported描述符),並且執行這個事務的線程將與一個事務上下文相關聯。啓動一個新線程,不會將事務上下文傳播給子線程。這將導致在容器檢測到子線程試圖訪問事務資源而沒有事務上下文時創建新的事務。

儘管一些(或大多數?)的事務管理器支持多線程擁有相同的事務上下文存在,這可能(而且很可能會)不適用於應用程序啓動線程。

+0

OP沒有提到子線程會嘗試訪問事務資源。 – bpgergo 2011-06-07 14:21:07

+0

@Vineet Tks。我不打算在事務中使用此MDB,但生成兩個線程,但同時讓我們等待MDB完成線程。 – 2011-06-07 14:28:28

+0

@bpgergo,通常不重要。 EJB規範在起始線程上皺眉,但人們不知道爲什麼。我試過說出最合理的解釋。 – 2011-06-07 14:29:31

1

從MDB啓動線程違反了規範。

企業JavaBeansTM,版本3.0,EJB核心合同和需求在第21.1.2編程限制規定:

  • 企業bean不能使用線程同步原語同步多個實例的執行。

  • 企業bean不能試圖管理線程。企業bean不得嘗試 來啓動,停止,掛起或恢復線程,或者更改線程的優先級或名稱。企業bean不能嘗試管理線程組。

+0

Tks。但那應該是什麼選擇? – 2011-06-07 14:29:27

+0

@James Cooper:從隊列中獲取和處理消息已經是平行的,不是嗎?因此,像這樣一條消息構建消息 - >一個線程。 – bpgergo 2011-06-07 14:34:42

1

您從根本上忽略了Java EE和MDB的觀點。

在Java EE容器是管理的運行時環境。 Java EE容器背後的原理是通過將某些正交關注事項(如事務管理)委派給容器,該組件仍然專注於業務邏輯和(在utopia中)成爲一個可重用組件,它對其運行時環境幾乎沒有任何假設。

在MDB之前,Java EE容器是一個被動反應系統,它不允許協調容器端異步活動代理的操作。然後消息驅動Bean解決了這個問題,爲您提供了一個啓動異步操作的標準方式,即服務器端。

你有一個原始事件e0這被消耗MBD0。在消息,MDB0將產生e1和響應隊列消息MBD1,然後將完成其工作,併發送味精MDB2

有你有使用的pub/sub的N個順序步驟的簡單工作流程參與消息語義(並用異步語義O/C),和所有線程被容器管理。如果你希望有工作,然後收集結果,並踢了一個最後的行動並行的演員,可以考慮使用JMS涉及話題模式

+0

Tks。是的,我想從主MDB末尾的所有線程收集信息。即使如你所說,如果不是線程,我開始創建一個新的MDB池。那麼主MDB將如何等待最終收集結果?你能否詳細說出你的話「考慮使用涉及JMS主題的模式」......如何實現這種模式? – 2011-06-07 15:42:33

+0

主題是工作,並且條目按步驟。您的最終bean將得到通知,直到獲得最後一步的消息,說明「這裏是作業狀態和結果取回」。 – alphazero 2011-06-18 01:00:18