Apache-Camel:如何控制交换头的范围?

时间:2016-06-14 10:22:44

标签: java scope apache-camel

我使用交换标头存储路由中的任何变量。但是,看起来这些标题将被传递到从此路由调用的其他路由。

在下面的示例中,我调用了一个将调用http端点的getContact路由。但是,它也会发送标题,变量1&变量2,从初始路线得到,直接:开始。

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

有没有办法避免这种情况?相反,java中的方法调用将通过上下文切换隐藏所有现有变量。

3 个答案:

答案 0 :(得分:1)

在使用http4发送webservice调用之前,我遇到了这个问题。当你使用http4 / http端点时,Camel似乎发送了相当恼人的发送整个交换机。我使用content enricher解决了这个问题。我在rich路由中使用http4放置了实际的呼叫,然后有一个简单的聚合策略将这两个消息组合起来。

或者,您可以在bean中进行调用。这样你就失去了骆驼的一些好处,但是你可以完全控制呼叫体。

答案 1 :(得分:1)

没有直接的方法来避免这种情况。如果要将标头设置为硬编码值,则可以将标头移动到端点上的URI属性。如果没有,那么你只有2个其他选项。第一个选项是在HTTP调用后使用删除标头调用删除所有标头,这样它们就不会向下游移动。第二种方法是将所有标题设置在与http调用相同的路由中,并使用一个不同的路由调用该端点使用enrich语句,并在聚合中返回主路由,您可以自定义返回的交换。

以下是所有允许标头的驼峰http参考页面,以查看是否可以将其放入URI http://camel.apache.org/http4.html

删除标题的路由示例

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");

浓缩电话

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

实际上,在浏览骆驼文档时我想到了另外一个选项,我找到了一个有趣的属性。免责声明我从未尝试过这个属性,因为我仍在运行骆驼2.15 atm,但是可以随意测试它,它可能就是你需要的。

copyHeaders

默认: true

Camel 2.16:如果此选项为true,则根据复制策略将IN交换头复制到OUT交换头。将此设置为false,允许仅包含HTTP响应中的标头(不传播IN标头)。

答案 2 :(得分:0)

只需使用:

.removeHeaders("variable*")

删除任何模式的标题。