【问题标题】:Understanding JMS integration testing with Spring SingleConnectionFactory and CachingConnectionFactory了解使用 Spring SingleConnectionFactory 和 CachingConnectionFactory 进行 JMS 集成测试
【发布时间】:2011-03-17 21:08:55
【问题描述】:

请帮助理解以下内容:

我在我的应用程序中使用CachingConnectionFactory,并在我的 jms 测试期间首次使用它来测试我的 jms 配置,例如保证交付、回滚/提交等。

我使用 Spring 的 JmsTemplate 发送,DefaultMessageListenerContainer 在交付期间。

  1. 我注意到,当使用多个测试方法按顺序运行时,这很难/不可能 示例:在测试方法 A 中,我在消息侦听器(消费者端)中抛出异常,以便发生重试。 然后运行测试 B,在方法 A 中我做了一个不同的测试,但是当我开始这个测试时,我仍然收到来自测试 A 的重试消息,这显然是我不想要的。 我在测试之间通过 jmx 清除队列,但仍然收到这些重试:(... 我进行了搜索和调试......我不完全理解为什么这些重试不断出现,即使我确定清除正确发生。也许它已经被缓存在会话中的某个地方......我不知道。有人知道吗?

  2. 我发现在测试过程中我需要使用SingleConnectionFactory。有了这个连接工厂,重试就会消失,但我真的不明白为什么。为什么? 我知道它只使用一个连接(来自 Spring ref),并注意到它在每次发送操作后以某种方式删除了消费者,但我真的不明白这些重试会发生什么:(...有什么想法吗? (由于多线程行为并且很难在网络上找到关于它的好信息,因此很难调试) 同样使用只有一个会话缓存大小为 1 的 CachingConnectionFactory 也不能解决重试问题。

谢谢

【问题讨论】:

    标签: spring jms activemq jmstemplate


    【解决方案1】:

    最好的选择可能是使用embedded broker 并在每次测试之间启动/停止它,确保 deleteAllMessagesOnStartup 设置为 true 并且代理应该为你清除存储,这将确保你有一个干净的状态每次测试。看看 ActiveMQ 的单元测试,您可能也会受益,它是代理如何在自动化测试中使用的一个很好的示例来源。

    【讨论】:

    • 感谢 Stan,但这不起作用,因为我使用 Spring 的 DefaultMessageListenerContainer 并启用了缓存消费者,以便 RedeliveryPolicy 工作。因此,消息仍然存在于容器中。我尝试重新启动容器,但这既丑陋又奇怪。当我禁用消费者缓存时,它可以工作,但是 redeliveryPolicy 不起作用...... :(
    【解决方案2】:

    这不是一件容易解决的事情:删除测试之间的消息。 我尝试了很多事情,就像上面提到的:停止/启动代理和我用来消费消息的 Spring 的 DefaultMessageListenerContainer 类。 这一切似乎都有效,直到我将 DefaultMessageListenerContainer 中的缓存级别设置为 Consumer 以便缓存消费者。 这是必需的,这样 redeliveryPolicy 才能正常工作。 但是,这似乎会以某种方式将 DefaultMessageListenerContainer 缓存的所有内容和消息都搞砸了。

    最后,我通过在测试后简单地消费所有消息来解决它(只需等待一秒钟并消费所有 Ok),这样就可以开始下一个测试了。

    【讨论】:

      猜你喜欢
      • 2015-05-19
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 2019-08-11
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      相关资源
      最近更新 更多