Apache Camel路由Splitter没有返回原始消息

时间:2014-09-17 13:45:56

标签: java apache-camel

根据the Splitter documentation,在Camel 2.3或更新版本中,Splitter应该返回原始消息。我们使用的是2.13.2,但在split()之后,正文似乎是最后一条拆分消息(即Camel 2.2描述的行为)。

我们的路线如下:

    from(INPUT_SERVICE_ENDPOINT_URI)
            .wireTap(SAVE_COPY_OF_INPUT)
            .unmarshal(jaxbFormat)
            .process(createAuditRecord())
            .bean(webServiceValidator)
            .process(updateAuditRecord())
            .split(body())
                .choice()
                    .when(simple("${body.second.rejected}"))
                        .log(LoggingLevel.DEBUG, LOGGER_NAME, "Skipping import as it was rejected")
                    .otherwise()
                        .to(ExchangePattern.InOnly, IMPORT_QUEUE_ENDPOINT_URI)
                .endChoice()
            .end()
            .process(createWebServiceResponse())
            .marshal(jaxbFormat);

这个想法是单个Web服务请求包含要导入的多个项目。验证整个输入消息(webServiceValidator),并通过此验证器将消息正文转换为项目列表。然后我们拆分这些项目,以便它们将由导入队列单独处理。

createWebServiceResponse处理器假定消息正文与分割前的内容(即项目列表)一样,但看起来正文只包含一个项目(最后一个要处理的项目)。

这种行为是否正确? Splitter文档是错误的还是我误解了?或者我们在路线定义中做错了什么?

我意识到我没有实现聚合策略,就像在文档中提到的其他示例一样,但我希望避免必须这样做,如果我可以在分割之前得到消息的副本

1 个答案:

答案 0 :(得分:2)

导致此行为是因为我没有正确关闭“选择”块。即路线应如下所示:

from(INPUT_SERVICE_ENDPOINT_URI)
        .wireTap(SAVE_COPY_OF_INPUT)
        .unmarshal(jaxbFormat)
        .process(createAuditRecord())
        .bean(webServiceValidator)
        .process(updateAuditRecord())
        .split(body())
            .choice()
                .when(simple("${body.second.rejected}"))
                    .log(LoggingLevel.DEBUG, LOGGER_NAME, "Skipping import as it was rejected")
                .otherwise()
                    .to(ExchangePattern.InOnly, IMPORT_QUEUE_ENDPOINT_URI)
                .endChoice()
            .end()
        .end()
        .process(createWebServiceResponse())
        .marshal(jaxbFormat);