【发布时间】:2017-04-03 08:46:11
【问题描述】:
我们正在构建一个基于 Apache Camel 的消息路由器,并决定为多种格式使用通用流。我们通过一个通用的 rest 端点输入我们的消息,并有条件地将这个调用的主体映射到多种特定消息格式中的一种。我们从不同的 XSD 生成了我们特定的数据格式。
映射发生在处理器中,处理器根据消息的内容使用不同的映射器。该处理器将特定的 Java 模型放入交换体中。
在下一步中,我们希望将正文编组并验证为 XML。这是一个“通用”步骤,因为所有消息都必须编组为 XML。在此之后,它们再次根据消息内容发送到动态端点。
为了编组 XML,我们使用以下路由:
from("direct:marshal-xml")
.marshal(jaxbDataFormat)
.to("direct:validate-and-send");
根据名为“messageType”的标头属性,我们希望使用不同的 jaxbDataFormat 对象来编组为 XML。我们可以通过路由本身的选择来做到这一点,但我们希望使用一个专用的服务,它接受一个字符串输入,messageType,并返回正确的 jaxbDataFormat。
现在的问题是如何将标头属性“messageType”作为参数传递给服务。我们想使用类似的东西:
from("direct:marshal-xml")
.marshal(jaxbDataFormatService.getDataFormat(getHeader("messageType")))
.to("direct:validate-and-send");
但我似乎无法从标题中获取 messageType 作为字符串。在“建模”路由的 routebuilder 和从该模型生成的运行时路由之间似乎存在差异。
我尝试使用简单的表达式,但如果没有交换,我似乎无法评估它们:
simple("${header.messageType}").evaluate(exchange, String.class);
如何解决这个问题?我是否必须使用 routebuilder 中的选择组件,还是仍然可以使用此专用服务?
【问题讨论】:
标签: java apache-camel