2012-01-05 182 views
1

通过消息ID从主题中选择消息时出现问题。 这里的归结代码:JMS:无法通过选择器从主题中选择jms消息

//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”或空的:“”,null

即使它是持久订阅者,它也不会获取消息。

另一方面,如果我在消费者之后发布了一些东西,并且创建了真选择器,它确实会获取此消息。

,但像这样的代码并获取我的所有消息,包括一个用ID我一直在寻找

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

它看起来对我说DurableSubscriber与选择忽略现有消息。虽然我没有找到像在JMS 1.1规范

到目前为止,我只试过5.5.1的ActiveMQ作为JMS提供任何

问题是我做错了什么,或者它是一个错误吗?

回答

2

如果您连接到“之后”的消息发送给它(和你这样做),那么你无法接收到消息。除非使用持久订阅者,并且它已在“之前”被创建,则该消息被发送到该主题。

消息存储在主题中,仅用于活动的非持久订阅者和已经创建的持久订阅者。即使他们不在线。

您可以创建具有使用特定correlationId的选择器的持久订户,然后将该correlationId设置为您的消息并将其发送到主题。

+0

thanx。现在它很清楚它是如何工作的 – 2012-01-06 08:54:05

0

从我记得选择器的行为像SQL,所以你需要确保你实际上选择消息的有效属性。

尝试将您的选择器更改为`“JMSMessageID ='ID:<messageId>'”并查看是否有效。

+0

你是对的jms选择器是SQL像。我尝试了很多种类:null,“”,“1 = 1”,“true”,“JMSMessageID ='ID:QWERTY ... 52-2:0:1:1:1'”,“JMSMessageID IN :QWERTY ... 52-2:0:1:1:1','QWERTY ... 52-2:0:1:1:1')“。没有任何工作 – 2012-01-05 12:18:17

1

当消息传递提供程序从生产者获取发布时,它会检查是否有任何与发布主题相匹配的预订。如果找到匹配的订阅,则将发布发送给这些订阅者。因此,在发布消息之前,必须首先创建订阅。

+0

我想过。您为此创意添加了+1。换句话说,你无法通过id从主题获取消息。无论如何,我不再需要它了。非常感谢。 – 2012-01-06 08:50:32

+0

虽然有一种方法,通过使用Retain出版物。消息传递提供者有能力缓存发布在主题上的消息。大多数供应商仅缓存最后的发布。因此,通过保留发布功能,订阅者进入时至少会获得上次发布的最新发布(如果不是全部)。 – Shashi 2012-01-06 10:55:54