使用Spring SingleConnectionFactory和CachingConnectionFactory了解JMS集成测试

时间:2011-03-16 09:54:55

标签: spring jms activemq jmstemplate

请帮助您理解以下内容:

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

我使用Spring的JmsTemplate发送和DefaultMessageListenerContainer在发送期间。

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

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

  3. 由于

2 个答案:

答案 0 :(得分:1)

最好的选择可能是使用embedded broker并在每次测试之间启动/停止它,确保deleteAllMessagesOnStartup设置为true并且经纪人应该清除你前面的商店,这将确保你得到一个干净的每个测试的石板。您也可以从查看ActiveMQ的单元测试中受益,它是如何在自动化测试中使用代理的一个很好的示例来源。

答案 1 :(得分:1)

修复并不容易:删除测试之间的消息。 我尝试了很多东西,如上所述:停止/启动代理和Spring用于消费我的消息的类DefaultMessageListenerContainer。 这一切似乎都有效,直到我转向我将DefaultMessageListenerContainer中的缓存级别设置为Consumer,以便缓存使用者。 这是必需的,以便redeliveryPolicy工作。 然而,这似乎搞乱了DefaultMessageListenerContainer以某种方式缓存的所有内容和消息,就像看起来一样。

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