Java ApacheCamel:如何控制exchange头的作用域?
我正在使用exchange头来存储路由中的任何变量。但是,看起来这些头将被带到从该路由调用的其他路由 在下面的示例中,我将调用一个getContact路由,该路由将调用http端点。但是,它还将发送从初始路由direct:start获得的头文件variable1和variable2Java ApacheCamel:如何控制exchange头的作用域?,java,scope,apache-camel,Java,Scope,Apache Camel,我正在使用exchange头来存储路由中的任何变量。但是,看起来这些头将被带到从该路由调用的其他路由 在下面的示例中,我将调用一个getContact路由,该路由将调用http端点。但是,它还将发送从初始路由direct:start获得的头文件variable1和variable2 from("direct:start") .setHeader("variable1", constant("value1")) .setHeader("var
from("direct:start")
.setHeader("variable1", constant("value1"))
.setHeader("variable2", constant("value2"))
.to("direct:getContact");
from("direct:getContact")
.setHeader("Content-Type", constant("application/json"))
.setHeader("Accept", constant("application/json"))
.setHeader(Exchange.HTTP_METHOD, constant("GET"))
.to("http://<host>:<port>/contact/3")
.unmarshal().json(JsonLibrary.Jackson);
from(“直接:开始”)
.setHeader(“变量1”,常量(“值1”))
.setHeader(“变量2”,常量(“值2”))
。致(“直接:获取联系”);
发件人(“直接:getContact”)
.setHeader(“内容类型”,常量(“应用程序/json”))
.setHeader(“接受”,常量(“应用程序/json”))
.setHeader(Exchange.HTTP_方法,常量(“GET”))
.to(“http://:/contact/3”)
.unmarshal().json(JsonLibrary.Jackson);
有没有办法避免这种情况?相反,java中的方法调用将通过上下文切换隐藏所有现有变量 我以前在使用http4发送webservice调用时遇到过这个问题。当您使用http4/http端点时,Camel似乎发送整个交换,这相当令人恼火。我用了一种新方法解决了这个问题。我使用http4将实际的调用放在enrich路由中,然后使用一个简单的聚合策略将这两条消息组合起来 或者,您可以在bean中进行调用。这样一来,您就失去了camel的一些好处,但您可以完全控制通话内容。只需使用:
.removeHeaders("variable*")
删除任何模式的标题。没有直接的方法可以避免这种情况。如果将头设置为硬编码值,则可以将头移动到端点上的URI属性。如果不是,那么你只有两个选择。第一个选项是在HTTP调用之后使用remove header调用删除所有头,这样它们就不会进入下游。第二种方法是在http调用相同的路由中设置所有的头,并使用一个RENCHIM语句对端点进行不同的路由调用,在聚合回主路由时,您可以自定义返回的交换 这里有一个驼峰http引用页面,用于所有允许的头,以查看是否可以将其放入URI中 移除标头的路由示例
from("direct:start")
.setHeader("variable1", constant("value1"))
.setHeader("variable2", constant("value2"))
.setHeader("Content-Type", constant("application/json"))
.setHeader("Accept", constant("application/json"))
.setHeader(Exchange.HTTP_METHOD, constant("GET"))
.to("http://<host>:<port>/contact/3")
.unmarshal().json(JsonLibrary.Jackson)
.removeHeaders("variable*")
.to("Anything I call now won't have the variable headers");
实际上,在浏览camel文档时,我想到了另外一个选项,我发现了一个有趣的属性。免责声明我自己从来没有尝试过这个属性,因为我仍然在运行骆驼2.15 atm,但请随时测试它非常快,它可能正是您所需要的
文头
默认值:true
Camel 2.16:如果此选项为true,则将根据复制策略将IN-exchange头复制到OUT-exchange头。将此设置为false,只允许包含HTTP响应中的头(不在头中传播)
AggregationStrategy aggregationStrategy = new ExampleAggregationStrategy();
from("direct:start")
.enrich("direct:getContact", aggregationStrategy)
.to("You can have no additional headers here");
public class ExampleAggregationStrategy implements AggregationStrategy {
public Exchange aggregate(Exchange original, Exchange resource) {
Object originalBody = original.getIn().getBody();
Object resourceResponse = resource.getIn().getBody();
Object mergeResult = //TODO implement this however you want. You can remove any headers here you like
if (original.getPattern().isOutCapable()) {
original.getOut().setBody(mergeResult);
} else {
original.getIn().setBody(mergeResult);
}
return original;
}
}