骆驼测试模板使用与我发送的不同的交换
Camel test template uses a different exchange than the one I send
我有以下测试:
public class MyTest extends CamelSpringTestSupport {
@Override
protected AbstractXmlApplicationContext createApplicationContext() {
return new ClassPathXmlApplicationContext(new String[] {
"classpath:my-config.xml",
});
}
@Test
public void testSomething() throws Exception {
Exchange exchange = new DefaultExchange(context);
exchange.getIn().setHeader("myId", "1234");
MessageContentsList parameters = new MessageContentsList();
parameters.add(0, "");
parameters.add(1, "1234");
exchange.getIn().setBody(parameters);
System.out.println("exchange before = " + System.identityHashCode(exchange)); //1657040467
template.send("direct:myRoute", exchange);
Object object = exchange.getOut().getBody();
System.out.println("result = " + object); //null
System.out.println("exchange after = " + System.identityHashCode(exchange)); //1657040467
assertFalse(exchange.isFailed());
}
}
这是路线中的最后一步 "direct:myRoute":
public void doSomething(Exchange exchange)
{
System.out.println("exchange within = " + System.identityHashCode(exchange)); //1649140180
exchange.getOut().setBody(1);
}
我的路线由 RouteBuilder
类 定义,我通过
加载它们
<camelContext id="mainContext" xmlns="http://camel.apache.org/schema/spring">
<packageScan>
<package>com.my.route</package>
</packageScan>
</camelContext>
也可以通过代码动态地:
((CamelContext) applicationContext.getBean("mainContext")).addRoutes(routeBuilder);
如您所见,当我从测试中调用路由时,我无法检索路由的输出,因为在测试中由于某种原因它是一个不同的交换 object(但是,原始交换headers 和属性以某种方式复制到路由内的交换)。
当我通过 XML.
定义路由时,不会发生此问题
为什么会这样,当我从测试中调用它时如何检索路由的结果?
我不是 100% 确定,但我不认为你可以这样写。
template.send("direct:myRoute", exchange);
Object object = exchange.getOut().getBody();
理想情况下应该是:
Exchange out=null;
out=template.requestBody("direct:myRoute", exchange);
String body=out.getOut().getBody();
为此,您需要将交换模式设置为 InOut。
有关模板的更多信息:
https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/ProducerTemplate.html
我有以下测试:
public class MyTest extends CamelSpringTestSupport {
@Override
protected AbstractXmlApplicationContext createApplicationContext() {
return new ClassPathXmlApplicationContext(new String[] {
"classpath:my-config.xml",
});
}
@Test
public void testSomething() throws Exception {
Exchange exchange = new DefaultExchange(context);
exchange.getIn().setHeader("myId", "1234");
MessageContentsList parameters = new MessageContentsList();
parameters.add(0, "");
parameters.add(1, "1234");
exchange.getIn().setBody(parameters);
System.out.println("exchange before = " + System.identityHashCode(exchange)); //1657040467
template.send("direct:myRoute", exchange);
Object object = exchange.getOut().getBody();
System.out.println("result = " + object); //null
System.out.println("exchange after = " + System.identityHashCode(exchange)); //1657040467
assertFalse(exchange.isFailed());
}
}
这是路线中的最后一步 "direct:myRoute":
public void doSomething(Exchange exchange)
{
System.out.println("exchange within = " + System.identityHashCode(exchange)); //1649140180
exchange.getOut().setBody(1);
}
我的路线由 RouteBuilder
类 定义,我通过
<camelContext id="mainContext" xmlns="http://camel.apache.org/schema/spring">
<packageScan>
<package>com.my.route</package>
</packageScan>
</camelContext>
也可以通过代码动态地:
((CamelContext) applicationContext.getBean("mainContext")).addRoutes(routeBuilder);
如您所见,当我从测试中调用路由时,我无法检索路由的输出,因为在测试中由于某种原因它是一个不同的交换 object(但是,原始交换headers 和属性以某种方式复制到路由内的交换)。 当我通过 XML.
定义路由时,不会发生此问题为什么会这样,当我从测试中调用它时如何检索路由的结果?
我不是 100% 确定,但我不认为你可以这样写。
template.send("direct:myRoute", exchange);
Object object = exchange.getOut().getBody();
理想情况下应该是:
Exchange out=null;
out=template.requestBody("direct:myRoute", exchange);
String body=out.getOut().getBody();
为此,您需要将交换模式设置为 InOut。 有关模板的更多信息: https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/ProducerTemplate.html