Java ApacheCamel:如何控制exchange头的作用域?

Java 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

我正在使用exchange头来存储路由中的任何变量。但是,看起来这些头将被带到从该路由调用的其他路由

在下面的示例中,我将调用一个getContact路由,该路由将调用http端点。但是,它还将发送从初始路由direct:start获得的头文件variable1和variable2

    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;
    }  
}