Группы сообщений в WebSphere MQ - PullRequest
       40

Группы сообщений в WebSphere MQ

7 голосов
/ 27 октября 2011

У меня есть требование, что мне нужно обрабатывать сообщения JMS (через MDB) таким образом, чтобы сообщения, принадлежащие определенной группе (установлен идентификатор группы), использовались одним и тем же экземпляром компонента. В этом случае мне требуется следующее: сообщения с одним и тем же идентификатором группы обрабатываются последовательно (хотя порядок сообщений не имеет значения), и привязка их к одному и тому же экземпляру MDB должна обеспечивать это.

Сообщения не содержат какого-либо порядкового номера (поскольку он не имеет значения), и мы не знаем, что такое первое или последнее сообщение в группе (теоретически «никогда» не может быть последнее сообщение в группе). Мы хотим, чтобы они были доставлены, как только потребитель сможет их получить.

ActiveMQ предоставляет именно эту функцию (http://activemq.apache.org/message-groups.html), просто устанавливая JMSXGroupID. Однако мы привязаны к WebSphere MQ. Все, что я до сих пор узнал, это то, что можно собирать сообщения одной группы в очередь и использование MessageSelector для получения сообщения «Последнее сообщение в группе», как описано в http://www.ibm.com/developerworks/websphere/library/techarticles/0602_currie/0602_currie.html. Мы бы предпочли более чистый способ (как в ActiveMQ). Кто-нибудь знает, как добиться такого поведения в WebSphere?

Спасибо!

1 Ответ

2 голосов
/ 27 октября 2011

Обычно вы используете MessageSelectors в реализациях продуктов IBM JMS (как в WebSphere MQ, так и в SIBus). Это эквивалент фильтра, который сканировал бы заголовок сообщения 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. Все остальное зависит только от разработчика технологии обмена сообщениями, которая затем является собственностью их реализации, а не переносимого кода.

...