0

我正在尝试编写一个 jUnit 测试来显示JMS订阅者的start()函数启动了主题的消息侦听器(并且在调用start()之前没有使用消息)。

我遇到了一个问题,即在调用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 回答