2016-06-14 16 views
1

私は経路内の変数を格納するために交換ヘッダを使用しています。しかし、これらのヘッダーがこのルートから呼び出される他のルートに引き継がれるように見えます。Apache-Camel:Exchangeヘッダーの範囲を制御する方法は?

以下のサンプルでは、​​httpエンドポイントを呼び出すgetContactルートを呼び出しています。しかし、それはまた、ヘッダー、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); 

これを回避する手段はありますか?対照的に、Javaのメソッド呼び出しは、コンテキストスイッチによって既存の変数をすべて非表示にします。

答えて

1

http4を使用してWebサービス呼び出しを送信する前に、問題が発生しました。あなたがhttp4/httpエンドポイントを使用しているときに、Camelが送信するように見えるのは面倒です。私はcontent enricherを使ってこれを回避しました。私はenrichルートでhttp4を使用して実際の呼び出しを行い、後で2つのメッセージを結合する単純な集計戦略を持っていました。

また、Beanで呼び出しを行うこともできます。この方法であなたはラクダの利点の一部を失いますが、あなたはコールボディを完全にコントロールできます。

0

ちょうど使用:

.removeHeaders("variable*") 

を任意のパターンのヘッダを削除します。

1

これを避ける直接的な方法はありません。ヘッダーをハードコードされた値に設定する場合は、ヘッダーをエンドポイントのURIプロパティーに移動できる可能性があります。そうでなければ、あなたは本当に2つの他の選択肢しか持たない。最初のオプションは、HTTPコールの後にremoveヘッダー呼び出しを使用してすべてのヘッダーを削除し、下流に行かないようにすることです。 2番目の方法は、すべてのヘッダーをhttp呼び出しと同じルートに設定し、エンリッチステートメントでエンドポイントと異なるルート呼び出しを行い、集約して戻った交換をカスタマイズできるメインルートに戻すことです。ここで

許可ヘッダのすべてのためのラクダの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; 
    } 
} 

実際にはもう1つのオプションが、ラクダ書類を通過するときに私は興味深い財産を見つけました。免責事項私は今でも私がラクダ2.15気圧で走っているので、私はこの財産を自分で試したことはありませんが、あなたが必要とするものであれば速やかにテストすることができます。

copyHeaders

デフォルト:

キャメル2.16:このオプションは為替ヘッダに続いtrueの場合は、コピー戦略に従ってOUT交換ヘッダにコピーされます。これをfalseに設定すると、HTTP応答(INヘッダーを伝播しない)からのヘッダーのみを含めることができます。

関連する問題