JMS - как селекторы сообщений работают с несколькими потребителями очереди и темы?
скажем, у вас есть очередь JMS, и несколько потребителей наблюдают за очередью сообщений. Вы хотите, чтобы один из потребителей получил все сообщения определенного типа, поэтому вы решили использовать селекторы сообщение.
например, вы определяете свойство для перехода в заголовок сообщения JMS с именем,targetConsumer
. Ваш селектор сообщений, который вы применяете к потребителю, известному как,A
, Это что-то вроде WHERE targetConsumer = 'CONSUMER_A'
.
ясно, что потребитель A теперь просто схватит сообщения с набором свойств, как в Примере. Будут ли другие потребители знать об этом? IOW, будет ли другой потребитель, не связанный селектором сообщений, захватить CONSUMER_A
сообщения, если он смотрит на очередь перед потребителем A
? Нужно ли применять селекторы сообщений, такие как,WHERE targetConsumer <> 'CONSUMER_A'
другим?
Я сейчас RTFMing и собираю эмпирические данные, но надеялся, что кто-то может знать с головы.
3 ответов
когда несколько потребителей используют одну и ту же очередь, селекторы сообщений должны быть правильно настроены между этими потребителями, чтобы не было конфликта в определении предполагаемого потребителя.
в случае message-driven-beans (потребитель сообщений JMS) селектор может быть указан в EJB-jar.таким образом, xml-файл позволяет выполнять настройку во время развертывания (вместо противоположного представления указания селектора сообщений во время развитие.)
редактировать: в реальной жизни это имеет смысл, когда разные потребители отвечают за обработку сообщений, содержащих одни и те же заголовки (часто генерируемые одним и тем же производителем), записанные в одну очередь. Например, селекторы сообщений могут использоваться в торговом приложении для различения ордеров на покупку и продажу, когда производитель не может записать сообщения JMS в две отдельные очереди на покупку и продажу.
Да, другой потребитель, который не использует селектор сообщений, получит сообщение, предназначенное для потребителя A (или, если на то пошло, любое сообщение поверх очереди). Поэтому при совместном использовании очереди приложения-потребители должны быть дисциплинированы и выбирать только те сообщения, которые предназначены для них.
"первый" потребитель сообщения JMS из очереди заберет сообщение, если селектор соответствует. "Первый" означает деталь реализации (может быть циклической, основанной на приоритете или близости сети). Поэтому при использовании селекторов в очередях вам нужно убедиться, что эти селекторы "не перекрываются".
более формально: не должно существовать сообщения, которое соответствует 2 селекторам в одной очереди
Это еще один недостаток очередей, по сравнению с тем - в практика вы всегда должны рассмотреть возможность использования темы в первую очередь. С темой каждый соответствующий потребитель получает сообщение.