ApacheCamel-CamelContext

CamelContext 次の図に示すように、Camelの他のすべてのサービスへのアクセスを提供します-

さまざまなサービスを見てみましょう。ザ・RegistryモジュールはデフォルトでJNDIレジストリであり、アプリケーションが使用するさまざまなJavaBeanの名前を保持します。キャメルとスプリングを併用すると、これがスプリングになりますApplicationContext。OSGIコンテナでCamelを使用する場合、これは次のようになります。OSGI registry。ザ・Type converters名前が示すように、入力をある形式から別の形式に変換するさまざまなロード型コンバーターが含まれています。組み込みのタイプのコンバーターを使用することも、独自の変換メカニズムを提供することもできます。ザ・Componentsモジュールには、アプリケーションで使用されるコンポーネントが含まれています。コンポーネントは、自動検出によってロードされます。classpathあなたが指定すること。OSGIコンテナーの場合、これらは新しいバンドルがアクティブ化されるたびにロードされます。すでに議論しましたEndpoints そして Routes前の章で。ザ・Data formats モジュールにはロードされたデータ形式が含まれ、最後に Languages モジュールはロードされた言語を表します。

ここのコードスニペットは、どのように CamelContext Camelアプリケーションで作成されます-

CamelContext context = new DefaultCamelContext();
try {
   context.addRoutes(new RouteBuilder() {
      // Configure filters and routes
   }
}
);

ザ・ DefaultCamelContext クラスはの具体的な実装を提供します CamelContext。にaddRoutes メソッドでは、の匿名インスタンスを作成します RouteBuilder。複数作成できますRouteBuilder複数のルーティングを定義するインスタンス。同じコンテキスト内の各ルートには、一意のIDが必要です。ルートは実行時に動的に追加できます。以前に定義したものと同じIDのルートが、古いルートに置き換わります。

中に入るもの RouteBuilder 次にインスタンスについて説明します。

ルート

ルーターは、メッセージを移動するためのルールを定義します fromtoロケーション。あなたが使うRouteBuilderJavaDSLでルートを定義します。ビルトインを拡張してルートを作成しますRouteBuilderクラス。ルートはで始まりますfromエンドポイントであり、1つ以上のエンドポイントで終了します。2つの間に、処理ロジックを実装します。1つのルート内に任意の数のルートを設定できますconfigure 方法。

ルートが作成される方法の典型的な例を次に示します-

context.addRoutes(new RouteBuilder() {
   @Override
   public void configure() throws Exception {
      from("direct:DistributeOrderDSL")
      .to("stream:out");
   }
}

のconfigureメソッドをオーバーライドします RouteBuilderクラスを作成し、ルーティングとフィルタリングのメカニズムを実装します。現在の場合、エンドポイントから受信した入力をリダイレクトしますDistributeOrderDSL エンドポイントによって指定されたコンソールに stream:out

言語の選択

さまざまな言語でルートを作成できます。同じルートが3つの異なる言語でどのように定義されているかのいくつかの例を次に示します-

Java DSL

from ("file:/order").to("jms:orderQueue");

SpringDSL

<route>
   <from uri = "file:/order"/>
   <to uri = "jms:orderQueue"/>
</route>

Scala DSL

from "file:/order" -> "jms:orderQueue"

フィルター

フィルタを使用して、入力コンテンツの一部を選択します。フィルタを設定するには、任意の述語実装を使用します。フィルタリングされた入力は、目的の宛先エンドポイントに送信されます。この例では、石鹸のすべての注文を除外して、それらをまとめて石鹸サプライヤーに送信できるようにします。

from("direct:DistributeOrderDSL")
   .split(xpath("//order[@product = 'soaps']/items"))
      .to("stream:out");

例では、 xpathフィルタリングの述語。フィルタリングにJavaクラスを使用する場合は、次のコードを使用します-

from("direct:DistributeOrderDSL")
   .filter()
      .method(new Order(),"filter")
         .to("stream:out");

ザ・ Order は、独自のフィルタリングメカニズムを備えたカスタムJavaクラスです。

ここのように、1つのルーティングで複数の述語を組み合わせることができます-

from("direct:DistributeOrderDSL")
   .choice()
      .when(header("order").isEqualTo("oil"))
         .to("direct:oil")
      .when(header("order").isEqualTo("milk"))
         .to("direct:milk")
      .otherwise()
         .to("direct:d");

したがって、すべての「石油」注文は石油ベンダーに送られ、「牛乳」注文は牛乳ベンダーに送られ、残りは共通のプールに送られます。

カスタムプロセッサ

カスタム処理を使用することもできます。以下の例では、というカスタムプロセッサを作成しますmyCustomProcessor ルートビルダーで使用します。

Processor myCustomProcessor = new Processor() {
   public void process(Exchange exchange) {
      // implement your custom processing
   }
};
RouteBuilder builder = new RouteBuilder() {
   public void configure() {
      from("direct:DistributeOrderDSL")
      .process(myProcessor);
   }
};

カスタムプロセッサを選択とフィルタリングとともに使用して、メディエーションとルーティングをより適切に制御できます。

from("direct:DistributeOrderDSL")
   .filter(header("order").isEqualTo("milk"))
      .process(myProcessor);

XMLの使用

必要に応じて、ルートをより大きなXMLで定義することもできます。次のXMLスニペットは、SpringXMLを介したフィルタリングとともにルートを作成する方法を示しています-

<camelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "direct:DistributeOrderXML"/>
      <log message = "Split by Distribute Order"/>
      <split>
         <xpath>//order[@product = 'Oil']/items</xpath>
         <to uri = "file:src/main/resources/order/"/>
         <to uri = "stream:out"/>
      </split>
   </route>
</camelContext>

ルートがどのように構築されるかを見てきましたが、エンドポイントを作成するさまざまな手法を見ていきます。