2011-10-27 184 views
7

我有一個需求,即需要通過屬於某個組的消息(組ID設置)處理同一個bean實例來處理JMS消息(通過MDB)。我需要的行爲是具有相同組ID的消息按順序處理(儘管消息順序無關緊要),並將它們綁定到相同的MDB實例應該提供該消息。WebSphere MQ中的消息組

這些消息沒有任何類型的序列號(因爲它是不相關的),我們不知道組中的第一條或最後一條消息是什麼(可能從未「成爲組中的最後一條消息」 。我們希望在消費者能夠接收到它們時立即交付。

ActiveMQ通過簡單地設置JMSXGroupID提供了這個確切的功能(http://activemq.apache.org/message-groups.html)。儘管如此,我們必然會遇到WebSphere MQ。我迄今發現的所有情況都是可以收集隊列中同一組的消息,並使用MessageSelector接收http://www.ibm.com/developerworks/websphere/library/techarticles/0602_currie/0602_currie.html中描述的「組中的最後消息」消息。我們寧願採用更清晰的方式(比如在ActiveMQ中)。有誰知道如何在WebSphere中實現這種行爲?

謝謝!

回答

2

通常在IBM產品實現中使用MessageSelectors(包括WebSphere MQ和SIBus實現)。這些相當於一個篩選器,它可以掃描基於Web的協議的HTTP或SOAP消息頭。

雖然它可能不是你想要的,但它實際上是一個乾淨而且通過設計深思熟慮的。但是,如果您不想使用MessageSelectors,則可能必須構建自己的消息並「處理」具有掃描標頭的前端MDB的消息,然後將消息轉發到適當的隊列關心分組消息的MDB將處理它們(排序的網關/消息選擇器模式)。

如果您使用的是「純粹」的JMS API,那麼您可以讓Session對象創建一個MessageConsumer,並使用指定的選擇器字符串(標頭中的值)進行過濾(您必須自己設置它)。

//assume we have created a JMS Connection and Session object already. 
//and looked up the Queue we want already. 
MessageConsumer consumerWithSelector = session.createConsumer(queue, groupId); 

這是純粹的JMS API給你的。其他任何東西都完全取決於消息傳遞技術的實現者,消息傳遞技術然後專用於其實現而不是便攜式代碼。

+0

謝謝,這就是我的預期。 – ftr

相關問題