【问题标题】:Apache Camel route Splitter not returning original messageApache Camel 路由拆分器未返回原始消息
【发布时间】:2014-09-17 13:45:55
【问题描述】:

根据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 处理器假定消息的正文将与拆分前一样(即项目列表),但似乎正文仅包含一个项目(最后一个要处理的项目)。

这种行为正确吗?拆分器文档是错误的还是我误解了它?还是我们在路由定义中做错了什么?

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

【问题讨论】:

  • 您看到的行为不正确。使用 Camel 2.13,您应该默认接收原始消息作为拆分操作的输出。可以肯定的是,尝试创建一个简单的测试路线(例如,拆分字符串列表)以确认您在更简单的情况下看到的行为。
  • 感谢您的确认!我按照你的建议创建了一个测试,它重现了我正在经历的行为,这让我发现我看到这个的原因是因为我错过了一个“.end()”。即 endchoice() 应该再缩进一次,然后在现有的“.end()”之前添加一个“.end()”。令人困惑!

标签: java apache-camel


【解决方案1】:

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

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);

【讨论】:

  • 请注明您的问题已回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
相关资源
最近更新 更多