2016-03-19 8 views
0

私は、ルートB呼び出し、ルートAがあります。キャメル:ネストされたルートのEndpointUriを取得

from("direct:a") 
.to("direct:b"); 

from("direct:b") 
.process(new Processor() { 
     @Override 
     public void process(Exchange exchange) throws Exception 
     { 
      System.out.println("Route B URI: " + exchange.getUnitOfWork().getRouteContext().getFrom().getEndpointUri()); //oops, prints direct:a 
     } 
    }); 

は私が独自のURIは、カプセル化ルートAのないURIをプリントアウトするには、ネストされたルートBを希望しますどうすればいい?

答えて

2

アファイック、それは可能ではないと思います。

UnitOfWorksはRouteContextのスタックを保持しますが、このスタックには公開されません。ただし、エクスチェンジがルーティングされているプロセッサの履歴にアクセスできます。このMessageHistoryのコレクションは、Exchange.MESSAGE_HISTORYというヘッダーにあります。これには、プロセッサのIDとエンドポイントの(墨塗りされた)URIが含まれます。

よりシンプル/堅牢なアプローチは、明示的にルートB.個人的に

を呼び出す各ルート上のヘッダを追加することができ、私はそれはのような情報//内部の詳細に依存することをお勧めしますとは思いませんルート!

0

は、あなたのルートにrouteId()命令を追加し、ルート定義にアクセスするためにそれを使用:

from("direct:b") 
    .routeId("routeB") 
    .process(new Processor() { 
      @Override 
      public void process(Exchange exchange) throws Exception { 
       System.out.println("Route B URI: " + exchange.getContext().getRoute("routeb").getFrom().getEndpointUri()); 
      } 
    }); 
+0

私は(特定の 'routeId'を指定することにより)で午前どのようなルートを知っていたならば、私は先に行く可能性があり、 EndpointUriをハードコードします。この問題は、どのルートで使用されるかを知らないプロセッサーを対象としています。私は、ExchangeからEndpointUriデータを取得しようとしています(おそらく)。 – rapt

+0

申し訳ありませんが、あなたの質問は、別の場所で使用される可能性のあるプロセッサを意味するものではありませんでした。 また、ルートを暗黙的に宣言することなく、「ルートに依存する」必要があるプロセッサの目的は何ですか?より多くの情報があれば、より良い答えが得られるかもしれません。 –