【发布时间】: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