我正在将不同对象的列表传递给 Camel 路线。我希望路由将每条消息的正文拆分为一个对象,并将正文的类放入 header 中(使用处理器)。
from("direct:in")
.split(body())
.process(new JmsTypeHeaderProcessor(body().getClass().getName()))
.to("mock:out");
我正在尝试这样...
@Produce(uri = "direct:in") private ProducerTemplate template;
@EndpointInject(uri = "mock:out") private MockEndpoint endpoint;
@Test
public void testRoute() throws Exception {
List<Object> list = new ArrayList<>();
list.add("String");
list.add(Integer.valueOf(1));
list.add(Boolean.FALSE);
template.sendBody(list);
for (Exchange ex : endpoint.getExchanges()) {
System.out.println("JMSType=" + ex.getIn().getHeader("JMSType"));
}
}
当我运行时,我发现我实际上有标题
JMSType=org.apache.camel.builder.ValueBuilder
JMSType=org.apache.camel.builder.ValueBuilder
JMSType=org.apache.camel.builder.ValueBuilder
正如我所料,并且愿意
JMSType=java.lang.String
JMSType=java.lang.Integer
JMSType=java.lang.Boolean
需要什么才能获得实际主体的类?
顺便说一句。我可以看到log("body.class")
返回我想要的内容,但我无法理解它的工作原理或根据我的需要调整它。
最佳答案
Camel 路线是在路线构建器中设计的,代码运行一次即可设置路线。
所以这段代码
.process(new JmsTypeHeaderProcessor(body().getClass().getName()))
被调用一次,body().getClass() 返回 ValueBuilder
,因为这是在 DSL 设计时用来指定正文等的内容。
如果您想访问运行时消息正文,请从处理器的 process
方法中的 Exchange
获取该正文。这是运行时消息,然后您可以获取正文。
关于java - 获取消息体的实际类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32762575/