【问题标题】:JMS MockTopic message not picked up by message listener?消息侦听器未接收到 JMS MockTopic 消息?
【发布时间】:2011-10-09 18:38:32
【问题描述】:

我正在尝试编写一个 jUnit 测试来显示 JMS 订阅者的 start() 函数会启动 Topic 的消息侦听器(并且在调用 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);

但这没有帮助。

实际运行程序似乎表明当前驻留在 Topic 上的消息在 start() 上处理。有谁知道为什么当前在 MockTopic 上的消息可能无法在 start() 处得到处理?是 MockTopic 的限制吗?

【问题讨论】:

    标签: java jms mockrunner


    【解决方案1】:

    我不完全清楚这是否是 MockTopic 问题,但对于标准 JMS,您不会期望已启动的侦听器在其启动之前接收已发布的消息,除非它是一个持久 订阅.坚持不在这里也不在那里。

    【讨论】:

    • 这是一个很好的观点。我不确定这是否是这个特定测试的问题,但值得研究。实际订阅设置为持久订阅,但我不确定这是否能正确延续到测试中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    相关资源
    最近更新 更多