我有一個要求,即客戶端發送的單個JMS消息必須可靠(準確一次)傳送到兩個系統。未啓用HA這2個系統,所以我想出了最好的建議是:如何將JMS消息「複製」到2個目的地?
創建單個隊列,其中客戶端職位,以
設立了兩個「中間」隊列
使用自定義的「DuplicatorMDB」將讀取來自客戶端隊列的消息並將其發佈到同一事務中的兩個隊列中。
client->JMSDQ->DuplicatorMDB->Q1->MDB->System1 \->Q2->MDB->System2
是否有這樣的任何現有的功能?如果一個或兩個後端系統停機,平衡系統以保持系統穩定的正確方法是什麼?
應用服務器的WebLogic 10
我不能用這個主題,因爲集羣中的主題將造成太大的消息重複。如果我們有2個實例,然後用主題,它會是這樣的:
client->Topic-->[email protected]>System1 | \->[email protected]>System2 \---->[email protected]>System1 \--->[email protected]>System2
因此,每一個消息都需要進行兩次交付給系統1和兩次系統2,如果有會在一個集羣8個服務器,每個消息將交付8次。這是我真正想避免的...
最後我有一些時間來測試它,這裏是我觀察到的: 集羣中的2個節點。 2個JMS服務器:node1上的jms1,node2上的jms2。 分佈式主題dt。具有持久訂閱的MDB和jms-client-id = durableSubscriber。啓動系統:0消息,mdb @ node1啓動,mdb @ node2嘗試定期連接,但不能因爲「客戶端ID,durableSubscriber,正在使用」。如預期。
發送100條消息: jms1 @ dt消息當前= 0,消息總數= 100,消費者當前= 1 我可以看到node1處理了100條消息。
jms2 @ dt消息當前= 100,消息總數= 100,消費者當前= 1 即在主題中「重複」消息未決。
在另外100條消息中發送,100個在node1上處理,200在node2上掛起。
重新啓動node1,mdb @ node2重新連接到dt並開始處理「掛起」消息。在節點2上處理了200條消息。
在node1啓動後,mdb @ node1無法連接到dt,而mdb @ node2已連接。
jms1 @ dt的消息電流= 0,消息總共= 0,消費者電流= 0
jms2 @ dt的消息電流= 0,消息總數= 200,消費者電流= 1
發送在100多個消息,我看到所有100條消息都在節點2上處理並在節點1上丟棄。
jms1 @ dt的消息電流= 0,消息總數= 100,消費者電流= 0
jms2 @ dt的消息電流= 0,消息總數= 300,消費者電流= 1
現在我重新啓動節點2,MDB @ node1重新連接到dt。重新引導後,mdb @ node2重新連接到dt,mdb @ node1從dt斷開連接。
jms1 @ dt的消息電流= 0,消息總數= 100,消費者電流= 1
jms2 @ dt的消息電流= 0,消息總共= 0,消費者電流= 1
我在100個消息中發送,所有都在節點2處理並存儲在主題在node1:
jms1 @ dt的消息電流= 100,消息總數= 200,消費者電流= 1
jms2 @ dt的消息電流= 0,消息總共= 0,消費者電流= 1
然後我關閉否de2,並且我看到在mdb @ node1重新連接到主題後,在node1上處理了100個「待處理消息」。
所以結果是: 我發送了400條消息,其中700條由MDB處理,其中300條是重複的。
它看起來像MDB重新連接工作良好,但如果託管「活動」MDB的節點出現故障,則消息可能會重複。
這可能是weblogic JMS實現的缺陷或功能。
我錯過了什麼嗎?爲什麼不使用主題? – SingleShot 2009-10-17 07:12:03
對持久訂閱的任何反饋? – 2009-10-20 09:43:07