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

#java #jms #ibm-mq #message-driven-bean

#java #jms #ibm-mq #компонент, управляемый сообщениями

Вопрос:

У меня есть требование, чтобы мне нужно было обрабатывать сообщения 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:

Обычно вы используете MessageSelectors в реализациях JMS продуктов IBM (как в WebSphere MQ, так и в реализациях SIBus). Это эквивалент фильтра, который сканирует заголовок сообщения HTTP или SOAP на наличие веб-протоколов.

Хотя это может быть не то, что вы хотите, на самом деле это чистый и хорошо продуманный дизайн.

Однако, если вы не хотите использовать MessageSelectors, вам, вероятно, придется создать свой собственный и «обработать» сообщение с помощью внешнего MDB, который сканирует заголовки, а затем пересылает сообщение в соответствующую очередь, где их будет обрабатывать только MDB, который заботится о сгруппированных сообщениях (вродешаблон выбора шлюза / сообщения).

Если вы используете «чистый» JMS API, то вы можете попросить объект сеанса создать 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. Все остальное зависит исключительно от разработчика технологии обмена сообщениями, которая затем является собственностью их реализации, а не переносимого кода.

Комментарии:

1. Спасибо, это то, чего я ожидал.