2017-06-07 22 views
0

恒久サブスクリプションを習得してください。私はhereの例を微調整しました。私は2つのプログラムを書いた。私はトピックを作成し、PERSISTENCEモードでメッセージを送信します。他のプログラムでは、同じ話題の永続的な購読者を作成し、受信しようとします。JMS永続サブスクリプション。購読者はメッセージを受信しません。

私は最初のプログラムを実行します。それは正常に終了します。その後、私は第2の(消費者)プログラムを実行します。しかしそこには何のメッセージも出ません。 receive()メッセージはブロックされたままです。

私には何が欠けていますか?プロデューサープログラムの

主要部分は、消費者プログラムの

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost"); 
try{ 
    con = connectionFactory.createConnection(); 
    con.setClientID("DurabilityTest"); 
    con.start(); 
    session = con.createSession(false, Session.AUTO_ACKNOWLEDGE); 
    Topic myFirstTopic = session.createTopic("myFirstTopic"); 
    MessageProducer producer = session.createProducer(myFirstTopic); 
    // Registering consumers. But not calling receive on them 
    MessageConsumer consumer1 = session.createDurableSubscriber(myFirstDurableTopic, "consumer1", "", false); 
    MessageConsumer consumer2 = session.createDurableSubscriber(myFirstDurableTopic,"consumer2", "", false); 
    TextMessage txtMsg = session.createTextMessage("Namaskar mitranno2!!"); 
    producer.send(myFirstTopic, txtMsg, DeliveryMode.PERSISTENT, Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE+10000); 
}catch(JMSException e){ 
    e.printStackTrace(); 
} 

主要部分は耐久性のあるトピックサブスクリプションのみが作成された後にメッセージを保持するために開始し

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost"); 
try{ 
    con = connectionFactory.createConnection(); 
    con.setClientID("DurabilityTest"); 
    con.start(); 
    session = con.createSession(false, Session.AUTO_ACKNOWLEDGE); 
    Topic myFirstTopic = session.createTopic("myFirstTopic"); 
    MessageConsumer consumer1 = session.createDurableSubscriber(myFirstTopic, "consumer1", "", false); 
    processMessage(consumer1,consumer1.receive()); 
    MessageConsumer consumer2 = session.createDurableSubscriber(myFirstTopic,"consumer2", "", false); 
    processMessage(consumer2,consumer2.receive()); 
}catch(JMSException e){ 
    e.printStackTrace(); 
} 

答えて

0

です。したがって、トピックにメッセージを送信し、ブローカに登録されている永続トピックサブスクリプションがない場合、それらのメッセージはメッセージの永続モードに関係なく破棄されます。

テストをやり直し、最初に永続的なトピックサブスクリプションを作成してから消費者を閉じると、永続的なメッセージをトピックに送信できます。その後、耐久消費者テストを再度実行すると、オフラインの間にメッセージが送信されます。

アプリケーションで正確に何が起こっているのか分かりにくいですが、VMブローカーの使用がここにある可能性があります。これら2ビットのプロデューサー/コンシューマーのそれぞれがVMブローカの自分のインスタンスは、同じVM内で実行されていますか?

あなたはブローカーに立ち向かい、クライアントプログラムを使用してブローカーに接続してみませんか?

+0

あなたが言ったシーケンスを試しました。うまく行かなかった。 –

+0

質問を更新してコードを表示してください。それ以外の場合は発生しませんでした。 –

+0

あなたは何をしているのかはっきりしていませんが、明らかに間違っています。 –

関連する問題