我有这个非常烦人的问题,我已经开发并测试了一个Apache Camel模块用于更大的应用程序,一切看起来很棒,直到我将代码提交到主存储库并且Jenkins尝试构建并运行我的测试。
本地(在我的Windows机器上)maven构建并运行一切正常但是在我们的jenkins服务器(linux)上它会因错误而每次测试失败。
Could not refresh JMS Connection for destination 'null' - retrying in 5000ms. cause: null
应用程序非常简单,它接受来自一个队列的消息,然后进行一些验证和转换,并将其发送到另一个队列。
在我的机器上,所有模拟的端点都可以使用预期值进行断言,而在我们的jenkins服务器上,这些模拟的端点断言在10秒后会超时。这不是工作负载问题,因为测试数据在我的机器上以毫秒为单位进行处理。我还可以看到我希望发生的一切都发生在我们的日志中。
该应用程序基于Spring 3.2.14构建,它使用Apache Camel 2.15.2,并且出于测试目的,我正在使用ActiveMQ 5.11.1。我确保每个框架只有一个版本,所以不应该有任何冲突 (用mvn依赖:树检查)
我很可能不允许显示任何代码,所以现在我将在没有它的情况下发布此帖子。
非常感谢任何可能是原因的建议。
EDIT1:
这是骆驼路线(简化):
// camel route A : entry point
@Inject
private Queue queueInn;
@Override
public void configure() throws Exception {
from("jms:queue:" + queueInn.getName()))
.routeId(ROUTE_NAME)
.multicast()
// TODO add additional routes add them to the parameter list to(queueA, queueB, .....)
.to(QueueA.IN_QUEUE)
.end();
}
// camel route B: basic logic
@Override public void configure() throws Exception {
from(IN_QUEUE)
.routeId(ROUTE_NAME)
.process(new MDCContextProcessor())
//Error handling
.onException(Throwable.class)
.setBody(exchangeProperty(CommonProperties.ORIGINAL_MESSAGE))
.log(LoggingLevel.ERROR, LOG, "... \n${exception.message} \n${exception.stacktrace}")
.to(QueueUtil.getCamelQueue(errorQueue))
.log(LoggingLevel.ERROR, LOG, "...")
.stop()
.end()
// processing
.log(LoggingLevel.DEBUG, LOG, "...")
.setProperty(CommonProperties.ORIGINAL_MESSAGE, body())
.to("validator:" + XSD_A)
.unmarshal(jaxbFormatA)
.choice()
.when(predicateA)
.log(LoggingLevel.DEBUG, LOG, "...")
.process(mapperA)
.marshal(jaxbFormatB)
.convertBodyTo(String.class)
.to("validator:" + XSD_B)
.to("jms:queue:" + queueOut.getName())
.log(LoggingLevel.DEBUG, LOG, "...")
.otherwise()
.log(LoggingLevel.DEBUG, LOG, "...")
.endChoice();
}
更新2:
经过大量的调试和测试后,我们得出结论,我们的问题与我们的Camel测试上下文有关,当没有其他测试运行时,我们的驼峰测试运行正常,但是如果我们有其他Spring测试使用相同的配置正如我们的Camel测试一样,模拟的端点开始表现得很奇怪。然而,只有在我们的骆驼测试之前执行正常的Spring测试时才会出现这种情况。如果我们的骆驼测试是第一次运行,它们工作得很好。这是我们的本地构建和CI服务器之间的区别以及我们问题的原因。
更新3: 我现在暂时解决了我的问题,我在使用我的测试上下文的所有其他测试中使用@DirtiesContext。虽然这有效,但我希望能够告诉我的骆驼测试类,它需要在开始运行测试之前创建一个新的上下文,有谁知道我会怎么做?