根据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文档是错误的还是我误解了?或者我们在路线定义中做错了什么?
我意识到我没有实现聚合策略,就像在文档中提到的其他示例一样,但我希望避免必须这样做,如果我可以在分割之前得到消息的副本
答案 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);