我使用交换标头存储路由中的任何变量。但是,看起来这些标题将被传递到从此路由调用的其他路由。
在下面的示例中,我调用了一个将调用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中的方法调用将通过上下文切换隐藏所有现有变量。
答案 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*")
删除任何模式的标题。