Apache Camel EIP路由 - 如何停止split()

时间:2016-04-05 16:25:18

标签: apache-camel cxf eip

我遇到以下问题:

// from("cxf:....")...
from("direct:start").process(startRequestProcessor) // STEP 1
            .choice()
                .when(body().isNull())
                        .to("direct:finish")
                .otherwise()
                    .split(body())  // STEP 2
                    .bean(TypeMapper.class) // STEP 3
                    .log("Goes to DynamicRouter:: routeByTypeHeader with header: ${headers.type}")
                    .recipientList().method(Endpoint1DynamicRouter.class, "routeByTypeHeader") // STEP 4
                    .ignoreInvalidEndpoints();

    from("direct:endpoint2") // STEP 6
            .log("Goes to DynamicRouter::routeByCollectionHeader with header: ${headers.collection}")
            .recipientList().method(Endpoint2DynamicRouter.class, "routeByCollectionHeader")
            .ignoreInvalidEndpoints();

    from("direct:endpoint1.1") // STEP 5
            .process(new DateRangeProcessor())
            .to("direct:collections");

    from("direct:endpoint1.2") // STEP 5
            .process(new SingleProcessor())
            .to("direct:collections");


    from("direct:endpoint2.2") // STEP 7
            .aggregate(header("collection" /** endpoint2.2 */), CollectionAggregationStrategy)
            .completionSize(exchangeProperty("endpoint22"))

            .process(new QueryBuilderProcessor())
            .bean(MyService, "getDbCriteria")

            .setHeader("collection", constant("endpoint2.1"))
            .to("direct:endpoint2.1").end();


    from("direct:endpoint2.1") // STEP 8
            .aggregate(header("collection" /** endpoint2.1 */), CollectionAggregationStrategy)
            .completionSize(exchangeProperty("CamelSplitSize"))
            .to("direct:finish").end();

    from("direct:finish")
            .process(new QueryBuilderProcessor())
            .bean(MyRepository, "findAll")
            .log("ResponseData: ${body}").
            marshal().json(JsonLibrary.Gson).end();

路线

  1. 接收json字符串并将其转换为JSONObjects的列表(HashSet)。
  2. 将收到的列表拆分为json对象。
  3. 根据对象内容设置相应的标题
  4. 根据标头将消息路由到endpoint1.1或endpoint1.2
  5. 将邮件转换为mongodb条件并发送到endpoint2
  6. Endpoint2根据另一个标头将消息路由到endpoint2.1或endpoint2.2。
  7. Endpoint2.2聚合所有收到的消息,处理它以获取mongodb Criteria并将其发送到endpoint2.1(completionSize在步骤2计算并保存在属性“endpoint22”中)。
  8. Enpoint2.1聚合所有消息(CamelSplitSize)将聚合消息转换为Query对象,并将其发送到Repository以检索数据。
  9. 我可以在调试器中看到有效的响应对象,但无论如何我都收到错误:

      

    找不到类java.util.HashSet,ContentType:application / json

    的消息正文编写器

    问题不在于响应对象,因为它与其他路由一起使用,并且它不包含HashSet。

    我的猜测是路由发送到输出的HashSet创建了第1步......

    我的问题是:

    • 路线输出有什么问题?
    • recipList()尝试转发 消息到无效端点(我必须使用.ignoreInvalidEndpoints()来避免异常):

        

      org.apache.camel.NoSuchEndpointException:找不到端点:   org.springframework.data.mongodb.core.query.Criteria@20f55e70,请   检查你的classpath包含所需的Camel组件jar。

    非常感谢任何帮助! 感谢。

1 个答案:

答案 0 :(得分:2)

我觉得很奇怪,但.aggregate()函数没有回复交换。它使用您的聚合策略,但始终回复传入的交换。阅读文档时不太清楚,但您必须使用聚合策略和split()才能返回交换。