2016-06-15 15 views
2

私はprocess queueのメッセージを処理してupload queueに送信するラクダルートを持っています。 impl.processApache Camel - エンドポイントとエンドポイントを動的に構築する

from("activemq:queue:process").routeId("activemq_processqueue") 
     .process(exchange -> { 
      SomeImpl impl = new SomeImpl(); 
      impl.process(exchange); 
     }) 
     .to(ExchangePattern.InOnly, "activemq:queue:upload"); 

私はIddestination server pathを移入しています。今、私はアップロードキューからメッセージを消費し、ローカルフォルダをコピーする新しいルートを定義する必要があります(以前のルートで生成されたIdに基づいて)そしてそれをftpサーバである宛先フォルダにアップロードしてください(これも以前のルートにあります)

エンドポイントとエンドポイントの両方が動的で、以下のような新しいルートを設計するにはどうすればよいですか?

キャメルにエンドポイントに動的に追加
from("activemq:queue:upload") 
     .from("file:basePath/"+{idFromExchangeObject}) 
    .to("ftp:"+{serverIpFromExchangeObject}+"/"+{pathFromExchangeObject}); 
+0

を見てみましょう。この回答を見る:http://stackoverflow.com/a/15254698/86798 –

+0

ですか?ありがとう@重力まだ私はいくつかの研究を行うでしょう! –

+0

VGヘッジ - あなたがリンクしている質問で、クラウスもその問題が修正されたと答えました。 –

答えて

2

私は2.16より新しいCamelバージョンを使用していることを認めて、あなたのケースには良い選択肢があると思います(以前のバージョンの代替は存在しますが、より複雑であり、 consumerTemplate recipientList)。

ポーリングコンシューマとシンプルな式を使用してメッセージを豊かにするpollEnrichを、ダイナミックファイルエンドポイントを構築するために置き換えることができます。 .toDは仕事をしますので、あなたのルートは次のようになります:

from("activemq:queue:upload") 
    .pollEnrich().simple("file:basePath/${header.idFromExchangeObject}) 
    .aggregationStrategy(new ExampleAggregationStrategy()) // * see explanation 
    .timeout(2000) // the timeout is optional but recommended 
    .toD("ftp:${header.serverIpFromExchangeObject}/${header.pathFromExchangeObject}") 
  1. コンテンツのエンリッチャセクション「動的なウイスルを使用する」 http://camel.apache.org/content-enricher.htmlを参照してください。

    元の交換をリソース交換と組み合わせて、集約後に集約された交換にヘッダーserverIpFromExchangeObject、pathFromExchangeObjectが含まれるようにするには、集約戦略が必要です。カスタム戦略を含まない場合、Camelはデフォルトでリソースから取得した本体を使用します。これがどのように動作するかは、content-enricher.htmlのExampleAggregationStrategyの例を参照してください。 .TODについては

  2. は()私はそれが可能だとは思わないhttp://camel.apache.org/how-to-use-a-dynamic-uri-in-to.html
+0

ありがとうございます@ ltsallas。これは私が探していたものです。私はいくつかの質問がありました: 1.集約戦略では、oldExchangeからnewExchangeに必要なヘッダーを設定してnewExchangeとそれ以外のものを返します。いいですか? 2.さまざまなパラメータに基づいてルートを動的に追加するので、手動でルートを削除する必要がありますか? –

+0

@ vg-hegde 1.はい、これは問題ありません。集計戦略で好きなことをすることができます。あなたの要求に応えます。 2.私は2番目の質問をよく理解していません。どこに経路を動的に追加しましたか? – ltsallas

+0

申し訳ありません私は返信を忘れていました! 。 "動的に経路を追加する"と私はMike Barlottaによって提供された他の答えのためにそれを意味しました –

2

は(コメントで述べたように)私は任意fromD()同等の知らないon this page on the Camel site. に記載されている.toD()で行うことができます。ただし、CamelContextaddRoutesメソッドを呼び出すと、動的ルートを追加できます。これについては、this page on the Camel site.

ここでは、Camelサイトの例を少し拡大すると、正しい方向に向かうべきものがあります。

public void process(Exchange exchange) throws Exception { 
    String idFromExchangeObject = ... 
    String serverIpFromExchangeObject = ... 
    String pathFromExchangeObject = ... 

    exchange.getContext().addRoutes(new RouteBuilder() { 
     public void configure() { 
      from("file:basePath/"+ idFromExchangeObject) 
      .to("ftp:"+ serverIpFromExchangeObject +"/"+pathFromExchangeObject); 
     } 
    }); 
} 

このフレームワークには驚くほど多くのEIPと機能があるため、Camelには他にもオプションがあります。

+1

ありがとうございます@Mike Barlotta。この解決策も働いた:) –

関連する問題