gpt4 book ai didi

java - 如何将 header 字符串传递给Camel中的服务

转载 作者:行者123 更新时间:2023-12-02 02:55:20 25 4
gpt4 key购买 nike

我们正在构建一个基于 Apache Camel 的消息路由器,并决定对多种格式使用通用流程。我们通过通用休息端点输入消息,并有条件地将调用的正文映射到多种特定消息格式之一。我们从不同的 XSD 生成了特定的数据格式。

映射发生在处理器中,该处理器根据消息的内容使用不同的映射器。该处理器将特定的 Java 模型放入交换主体中。

在下一步中,我们希望将正文编码并验证为 XML。这是一个“通用”步骤,因为所有消息都必须编码为 XML。之后,它们再次根据消息内容发送到动态端点。

为了编码(marshal) XML,我们使用以下路线:

from("direct:marshal-xml")
.marshal(jaxbDataFormat)
.to("direct:validate-and-send");

根据名为“messageType”的 header 属性,我们希望使用不同的 jaxbDataFormat 对象来编码为 XML。我们可以通过在路由本身中进行选择来做到这一点,但我们希望使用一个专用服务,它接受字符串输入、messageType,并返回正确的 jaxbDataFormat。

现在的问题是如何将 header 属性“messageType”作为参数传递给服务。我们想使用类似的东西:

from("direct:marshal-xml")
.marshal(jaxbDataFormatService.getDataFormat(getHeader("messageType")))
.to("direct:validate-and-send");

但我似乎无法从 header 中获取字符串形式的 messageType 。路由构建器(对路由进行“建模”)和运行时路由(从该模型生成)之间似乎存在差异。

我尝试使用简单的表达式,但我似乎无法在没有交换的情况下评估它们:

simple("${header.messageType}").evaluate(exchange, String.class);

如何解决这个问题?我是否必须使用路线构建器中的选择组件,或者仍然可以使用此专用服务吗?

最佳答案

您始终可以实现自己的“复合数据格式”,例如通过实现org.apache.camel.spi.DataFormat,它将了解您想要使用的所有数据格式并使用一个你想要的。

类似这样的东西,只是为了给你一个想法:

public class MyCompositeFormat implements DataFormat, CamelContextAware {

public MyCompositeFormat(DataFormat... formats) {
// store them to local variable
}

public CamelContext getCamelContext() {
return camelContext;
}

public void setCamelContext(CamelContext camelContext) {
this.camelContext = camelContext;
}

public void marshal(Exchange exchange, Object graph, OutputStream stream) throws Exception {
if (exchange.getIn().getHeader("SomeHeader",String.class).equals("whatever") {
return someFormatYouStored.marshal(exchange,graph,stream);
} else {
return anotherFormat.marshal(exchange,graph,stream);
}

}

public Object unmarshal(Exchange exchange, InputStream stream) throws Exception {
// similar approach to marshal
}

}

在你的 route :

MyCompositeFormat myCompositeFormat = new MyCompositeFormat(otherFormats);
from("direct:marshal-xml")
.marshal(myCustomFormat)
.to("direct:validate-and-send");

关于java - 如何将 header 字符串传递给Camel中的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43180159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com