【发布时间】:2019-03-07 19:22:53
【问题描述】:
我想对我的应用程序进行端到端测试,我需要确保 Camel 路由正常工作。我使用 NotifyBuilder 来确保消息已完成,并且由于使用消息需要一些时间,我想让它处理 30 秒(但如果消息更快完成,它不应该等待),然后继续进行验证。这工作正常,但是......但不幸的是,NotifyBuilder 有时不会对消息完成做出反应,但我的日志消息表明所有必需的步骤都已完成。这种情况并不总是发生,而是经常发生,平均从十次运行中发生 2 次。有趣的是,我在几次测试中都使用了这种方法,但他们随机地失败了这个问题,通常一次一个(所有其他都通过)。
稍微调试一下 Camel 代码后,我注意到 org.apache.camel.builder.NotifyBuilder.EventPredicateSupport#onExchangeCompleted 和 org.apache.camel.builder.NotifyBuilder.EventPredicateSupport#onExchange 方法由于某些原因没有被调用,即使相应的事件已被触发。
我还注意到,在单独运行测试时(一次一个),一切都按预期运行。此外,当我两次发送同一条消息时,NotifyBuilder 仅针对第二条消息调用 org.apache.camel.builder.NotifyBuilder.EventPredicateSupport#onExchangeCompleted。
我使用骆驼 2.18.3 和 JDK 8u60。操作系统 Linux Mint 17 和 CentOS(在 Windows 上似乎一切正常)。通过命令行中的 gradle 任务在单个线程中执行测试。
有谁知道这种行为的原因是什么?
提前致谢。
这是我的测试类代码和骆驼配置:
public class EndToEndTest {
@Resource(name = "camelContext")
private CamelContext camelContext;
@Produce(uri = "activemq:fromQueueName")
private ProducerTemplate template;
@Test
public void testWithNotifyBuilder() {
NotifyBuilder notify = new NotifyBuilder(camelContext)
.whenCompleted(1)
.from("activemq:fromQueueName")
.create();
template.sendBody("{\"json\":\"example\"}");
assertTrue(notify.matches(30, TimeUnit.SECONDS));
// other verifications
}}
<camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring">
<!-- other endpoints and beans -->
<endpoint id="fromEndpoint" uri="activemq:fromQueueName"/>
<route>
<from ref="fromEndpoint"/>
<unmarshal>
<custom ref="customMessageUnmarshaller"/>
</unmarshal>
<bean ref="customMessageConsumer"/>
<onException redeliveryPolicyRef="defaultRedeliveryPolicy">
<exception>java.net.SocketException</exception>
<exception>javax.jms.JMSException</exception>
<handled>
<constant>true</constant>
</handled>
</onException>
</route>
<!-- other routes -->
【问题讨论】:
-
您是否尝试过将谓词的顺序更新为
.from("activemq:fromQueueName").whenCompleted(1)?
标签: java apache-camel activemq