获取消息正文的实际类

时间:2015-09-24 13:24:51

标签: java apache-camel

我将不同对象的列表传递给驼峰路线。我希望路由将主体拆分为每个消息一个对象,并将主体的类放在标题中(使用处理器)。

    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")返回我想要的内容,但我无法跟踪它的工作原理或根据我的需要进行调整。

1 个答案:

答案 0 :(得分:1)

Camel路由在路径构建器中设计,代码运行一次,以设置路径。

所以这段代码

.process(new JmsTypeHeaderProcessor(body().getClass().getName()))

调用一次,而body()。getClass()返回ValueBuilder,因为这是在设计时用于指定正文等的内容。

如果要访问运行时消息正文,请从处理器的Exchange方法的process中获取该消息。那是运行时消息,然后你可以得到正文。