Apache Camel - 将拆分结果发送到CXF端点

时间:2016-04-06 09:26:13

标签: java apache-camel cxf cxfrs

我有一条路由应该处理来自CXF端点的请求并将结果返回为JSON:

public class MyRoute extends RouteBuilder
{

// ... Autowired:
// msgRequestProcessor - converts json {string,string} to String of "\n" delimited json string: {string}\n{string}
// RangeProcessor, SingleProcessor - create mongodb Criteria object from json string
// msgTypeMapper - adds corresponding header "msg.type"

@Override
public void configure()
{
    from("direct:list")
            .process(msgRequestProcessor)
            .split(body())
                .bean(msgTypeMapper.class)
                .choice()
                    .when(header("msg.type").isEqualTo("single"))
                        .log("Go to direct:single")
                        .to("direct:single")
                    .otherwise()
                        .log("Go to direct:range")
                        .to("direct:daterange")
            .end()
            .to("direct:aggregate");

    from("direct:range")
            .process(new RangeProcessor());

    from("direct:single")
            .process(new SingleProcessor());

    from("direct:aggregate")
            .aggregate(new MyAgg()).header("msg.collection").completionSize(2)
            .log("RETVAL: ${body}")
            .marshal().json(JsonLibrary.Gson).end();
}

public static final class MyAgg implements AggregationStrategy {
    @Override
    public Exchange aggregate(Exchange oldExchange, Exchange newExchange)
    {
        if (oldExchange == null) {
            return newExchange;
        }

        Criteria oldCriteria = oldExchange.getIn().getBody(Criteria.class);
        Criteria newCriteria = newExchange.getIn().getBody(Criteria.class);

        Criteria criteria = new Criteria();
        criteria.andOperator(oldCriteria, newCriteria);
        oldExchange.getIn().setBody(criteria.getCriteriaObject().toString());

        return oldExchange;
    }
}

}

一切正常,我在日志中看到正确的聚合结果和聚合完成

但CXF端点始终返回msgRequestProcessor的输出(拆分前):

{"string"}
{"string"}

虽然我希望看到Criteria对象转换为字符串(我可以在日志中看到)。

任何帮助将不胜感激!感谢。

1 个答案:

答案 0 :(得分:1)

首先请注意,您的缩进具有误导性,end()实际上是choice()的结尾,而不是split()的结尾;我被这个困惑了一段时间(因为@Ralf可能是。)

现在,聚合工作,但其结果被丢弃,因为拆分的结果确实是输入消息。

对于拆分器( in-out )的请求/回复用法,您实际上必须声明聚合策略以及split() as explained here(同样误导性缩进) )。

在你提到的官方文档中,情况是相反的( in-only ):拆分器的结果被丢弃,聚合的结果被路由到下游。