2012-01-05 24 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"または空の1: ""、null

耐久性のあるサブスクライバでもメッセージをフェッチしません。

一方、alsways trueセレクタを使用して消費者の後に何かを投稿すると、このメッセージが取得されます。

しかし、このようなコードは、私はそれがセレクタとDurableSubscriberのは、既存のメッセージを無視するように私には見えます

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

を探してきたIDを持つものを含むすべての私のメッセージをフェッチありません。私は

は、これまでのところ、私は唯一のActiveMQ 5.5.1 JMSプロバイダとして試みJMS 1.1仕様でそのようなものを見つけられませんでしたが

質問は、私が何か間違ったことをやっている場合、またはそれはバグですか?

答えて

2

トピックに接続した後にメッセージが送信された場合、メッセージを受信する方法はありません。永続的なサブスクライバが使用されておらず、メッセージがトピックに送信された前に作成されていない場合

アクティブ非永続サブスクライバおよびすでに作成された永続サブスクライバに対してのみ、メッセージがトピックに格納されます。たとえオフラインであっても。

特定のcorrelationIdを使用するセレクタを使用して永続サブスクライバを作成し、そのcorrelationIdをメッセージに設定してトピックに送信できます。

+0

ありがとう。今それはどのように動作するかはかなり明確です –

0

セレクタはSQLのように動作するので、実際にメッセージの有効なプロパティに対して確実に選択する必要があります。

セレクタを「 "JMSMessageID = 'ID:<messageId>' ''に変更して、それが機能するかどうかを確認してください。

+0

右のjmsセレクタはSQLのようです。私は多くの種類を試しました:null、 ""、 "1 = 1"、 "true"、 "JMSMessageID = 'ID:QWERTY ... 52-2:0:1:1:1'"、 "JMSMessageID IN( 'ID :QWERTY ... 52-2:0:1:1:1 '、' QWERTY ... 52-2:0:1:1:1 ')」となる。何も動かない –

1

メッセージングプロバイダがプロデューサからパブリケーションを取得すると、パブリケーショントピックに一致するサブスクリプションがあるかどうかを確認します。一致するサブスクリプションが見つかると、それらのサブスクライバにパ​​ブリケーションが配信されます。したがって、メッセージを発行する前にまず購読を作成する必要があります。

+0

私はそれについて考えました。このアイデアに+1を追加しました。言い換えれば、idによってトピックからメッセージを取得する方法はありません。とにかく私はもうそれを必要としません。どうもありがとう。 –

+0

ただし、Retain Publicationsを使用すると、1つの方法があります。メッセージングプロバイダには、トピックに公開されたメッセージをキャッシュする機能があります。ほとんどのプロバイダは最後のパブリケーションのみをキャッシュします。したがって、保持機能を使用すると、加入者は、少なくとも以前に公開されたすべてではないにしても、最後の発行を受けることになります。 – Shashi

関連する問題