1

请帮助理解以下内容:

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

我正在使用 SpringJmsTemplate进行发送和DefaultMessageListenerContainer交付。

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

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

谢谢

4

2 回答 2

1

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

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

于 2011-03-17T13:08:55.890 回答
1

最好的选择可能是使用嵌入式代理并在每次测试之间启动/停止它,确保 deleteAllMessagesOnStartup 设置为 true 并且代理应该为您清除存储,这将确保您为每个测试获得一个干净的状态。您可能还可以从查看 ActiveMQ 的单元测试中受益,它是如何在自动化测试中使用代理的示例的良好来源。

于 2011-03-16T14:40:57.180 回答