2009-06-23 64 views
0

我有2個消息驅動的豆。 2這些豆的激活規格。我有一條消息總線,並且兩條激活規範都配置爲這一條總線。我爲這條消息總線配置了2個不同的隊列和一個隊列連接工廠。消息驅動豆 - 單總線,多激活規格

現在,我會編寫我的代碼,在確定隊列後,在運行時向其中一個隊列發送消息。但是,我的兩個MDB都收到相同的消息。 這種配置通常如何完成?我總是配置1隊列 - > 1隊列連接工廠 - > 1消息總線 - > 1 MDB?這全是一對一的關係嗎?

哦,我忘了提這樣的:我在使用WebSphere Application Server V6.1

回答

3

一般概念是:

  1. 一個消息被髮送(隊列)/出版(主題)到目的地(隊列/主題)
  2. 所述的ActivationSpec偵聽消息在特定的實際連結(隊列/主題)
  3. ActivationSpec:目標是1:1的關係
  4. bean(MDB是一個消費者)被配置爲偵聽ActivationSpec。

這意味着實際上bean是通過activationSpec提供的一個間接層鏈接到一個目的地。

巴士是從哪裏來的 - SIBus是使這一切成爲可能的信息基礎設施。目的地在巴士上託管。

回答這個問題 - ActivationSpec將被配置爲監聽總線上將要發送消息的目的地。連接工廠決定發送消息的總線。只要目的地名稱是唯一的並且針對特定隊列(JMS隊列連接到總線上的目的地),則一條消息將僅被一個ActivationSpec接收。

在總線上創建了多少個目的地(在WAS管理控制檯中的SIBus鏈接下)?你可以檢查/驗證配置是否正確?

回答你的問題 - 「是每個激活規範一個總線,每個隊列有一個隊列連接工廠。」 - 答案是不。

  1. 總線是可以承載「n」個目的地的基礎架構。一個ActivationSpec監聽一個目的地。
  2. 使用隊列連接工廠是用於創建隊列的工廠(J2EE工廠模式)。
1

我想你說你想同時多邊開發銀行收到同樣的消息,對不對?

如果是這種情況,那麼MDB應該正在監聽主題而不是隊列

另外,有一些方法可以配置IBM MQ轉發的消息,因此,例如發佈到特定隊列的消息可以被重新發布到ň其他隊列,但我只看到當重新發布之前發生某種消息豐富化的時候就會使用它,所以我懷疑對於你想實現的目標會有些過火。

1

爲什麼你需要消息總線?

通常我將一個MDB與一個隊列相關聯 - 這是1:1的關係。向隊列發送消息,監聽器獲取它。什麼是巴士購買你?

我已經用WebLogic完成了JMS,並且沒有必要的消息總線這樣的構造。我認爲這是IBM的事情。

Here's一個如何用Spring來做JMS的例子。這就是我推薦進行的方式。

更新:我誤解了你的問題。當你說你的隊列都收到同樣的信息時,我不認爲這是所期望的行爲。如果是,話題是正確的路要走。隊列是點對點消息;主題是發佈/訂閱。

+0

@duffymo確實,這是IBM的事情。而且,不,我並不是想說接收相同信息的兩個隊列都是理想的行爲。我們正在談論兩個不同的隊列和不同的信息。問題是:它總是 - 每個激活規範一個總線,每個隊列一個隊列連接工廠。如果我要將消息發送到單個隊列並使用MDB進行拾取,它是否都是1-1-1的關係? – Jay 2009-06-23 11:17:18

+0

是的,這就是隊列中體現的點對點模型。正如尼克霍爾特所說,如果你想要多個用戶訪問相同的消息,你應該使用一個主題而不是一個隊列。 – duffymo 2009-06-23 11:30:26

1

我懷疑你的配置沒有按照你的想法設置。我們使用您所描述的相同配置,包含許多MDB(具有隊列和激活規範),單個工廠和消息總線,並且所有事情都按預期工作。

要實現您看到的行爲實際上並不可行,除非您將相同的消息發送到兩個隊列,或者定義了主題而不是隊列。我非常肯定,即使兩個MDB都從同一個隊列中讀取數據,只有一個隊列會收到消息,因爲隊列只支持點對點消息傳遞。你所描述的是基於主題的行爲。