JMS: не может выбрать сообщение JMS из темы селектором - PullRequest
1 голос
/ 05 января 2012

Возникла проблема с выбором сообщения из темы по идентификатору сообщения.Вот приведенный ниже код:

//publish message
connectionFactory = new ActiveMQConnectionFactory("vm://localhost"); 
//or external broker: tcp://localhost:61616

con = connectionFactory.createConnection();
con.setClientID("foo");
con.start();
session = connection.createSession(true, Session.SESSION_TRANSACTED);
topic = session.createTopic("topic_name");
producer = session.createProducer(topic);
//create text message
producer.send(message);
messageId = message.getJMSMessageID();
session.commit();
//close all stuff

//get message by id (the same VM split second after publishing)
//get connection the same way as for publishing
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
topic = session.createTopic("topic_name");
consumer = session.createDurableSubscriber(topic, "SUBS1", "JMSMessageID='messageId'", false);
//here we get stuck though the message IS there
msg = consumer.receive(); //receiveNoWait gives null

Более того, даже если я предоставляю селектор, который всегда верен, например, «1 = 1» или пустой: «», нуль

, он не выбирает сообщенияКроме того, несмотря на то, что он является надежным подписчиком.

С другой стороны, если я отправляю что-то после того, как потребитель с созданным всегда истинным селектором, он получает это сообщение.

, но подобный код ДЕЙСТВИТЕЛЬНО извлекает все мои сообщенияв том числе с идентификатором, который я искал

consumer = session.createDurableSubscriber(topic, "SUBS1");
while (msg != null) {
    msg = consumer.receive();
}

Мне кажется, что DurableSubscriber с селектором игнорирует существующие сообщения.Хотя я не нашел ничего подобного в спецификации JMS 1.1

До сих пор я пробовал только ActiveMQ 5.5.1 в качестве JMS-провайдера

Вопрос в том, что я делаю что-то не так или это ошибка?

Ответы [ 3 ]

2 голосов
/ 05 января 2012

Если вы подключаетесь к теме «после» сообщения, отправленного ей (и вы это делаете), то вы не сможете получить сообщение. Если не используется надежный подписчик, и он был создан «до», сообщение было отправлено в тему.

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

Вы можете создать надежного подписчика с селектором, который использует определенный идентификатор корреляции, а затем установить этот идентификатор корреляции для своего сообщения и отправить его в тему.

1 голос
/ 06 января 2012

Когда провайдер обмена сообщениями получает публикацию от производителя, он проверяет, есть ли какие-либо подписки, соответствующие теме публикации. Если найдены соответствующие подписки, публикация доставляется этим подписчикам. Поэтому подписки должны быть созданы в первую очередь перед публикацией сообщений.

0 голосов
/ 05 января 2012

Из того, что я помню, селекторы ведут себя как SQL, поэтому вам нужно убедиться, что вы действительно выбираете действительные свойства сообщения.

Попробуйте изменить селектор на `" JMSMessageID = 'ID: ' "и посмотрите, работает ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...