0

JMSサブスクライバーのstart()関数がトピックのメッセージ リスナーを開始すること (およびstart()が呼び出される前にメッセージが消費されていないこと)を示す jUnit テストを作成しようとしています。

start()関数が呼び出される前にトピックに配置されたメッセージが、start() が呼び出されると処理されないという問題が発生しいます。start()が呼び出された後にトピックに配置されたメッセージは、すぐに処理されます。

MockTopic topicWriter = getMockTopic(TOPIC);

// publish a message for the listener to pick up
MockObjectMessage objectMessage = new MockObjectMessage(message);
objectMessage.setBooleanProperty("Broadcast", true);

topicWriter.addMessage(objectMessage);

// the message doesn't get consumed because the subscriber has not been started
//...assert that the message is not processed... (**SUCCEEDS**)

// start the subscriber/listener
subscriber.start();

//...assert that the messages sitting on the topic get processed... (**FAILS**)

// publish a message for the listener to pick up
topicWriter.addMessage(objectMessage);

//...assert that the message gets processed... (**SUCCEEDS**)

これはstart()の前にリスナーが実行されていないことを示していますが、メッセージ リスナーを開始すると、現在トピックにあるすべてのメッセージが処理されるはずです。

以下を追加して、永続性が原因ではないことを確認しようとしました:

    objectMessage.setJMSDeliveryMode(DeliveryMode.PERSISTENT);

しかし、これは役に立ちませんでした。

実際にプログラムを実行すると、トピックに現在存在するメッセージがstart()で処理されることが示されているようです。現在MockTopicにあるメッセージがstart()で処理されない理由を知っている人はいますか? それはMockTopicの制限ですか?

4

1 に答える 1

0

これが MockTopic の問題かどうかは完全にはわかりませんが、標準の JMS に関しては、永続的なサブスクリプションでない限り、開始されたリスナーが開始前に発行されたメッセージを受信するとは思わないでしょう。永続性はここにもありません。

于 2011-07-22T14:46:32.583 に答える