2012-01-05 143 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