Apache-camel-camelcontext
Apache Camel-CamelContext
*CamelContext* は、次の図に示すように、キャメルの他のすべてのサービスへのアクセスを提供します-
さまざまなサービスを見てみましょう。 Registry モジュールはデフォルトではJNDIレジストリであり、アプリケーションが使用するさまざまなJavabeanの名前を保持しています。 SpringでCamelを使用する場合、これはSpring ApplicationContext になります。 OSGIコンテナでCamelを使用する場合、これは* OSGIレジストリ*になります。 名前が示すように Type converters には、入力をある形式から別の形式に変換するさまざまなタイプのコンバーターが含まれています。 組み込みのタイプコンバーターを使用するか、独自の変換メカニズムを提供できます。 Components モジュールには、アプリケーションで使用されるコンポーネントが含まれています。 コンポーネントは、指定した classpath の自動検出によってロードされます。 OSGIコンテナの場合、これらは新しいバンドルがアクティブ化されるたびにロードされます。 前の章で*エンドポイント*と*ルート*について既に説明しました。 *データ形式*モジュールにはロードされたデータ形式が含まれ、最後に*言語*モジュールはロードされた言語を表します。
ここのコードスニペットは、Camelアプリケーションで CamelContext がどのように作成されるかを垣間見ることができます-
CamelContext context = new DefaultCamelContext();
try {
context.addRoutes(new RouteBuilder() {
//Configure filters and routes
}
}
);
*DefaultCamelContext* クラスは、 *CamelContext* の具体的な実装を提供します。 *addRoutes* メソッドでは、 *RouteBuilder* の匿名インスタンスを作成します。 複数の *RouteBuilder* インスタンスを作成して、複数のルーティングを定義できます。 同じコンテキストの各ルートには一意のIDが必要です。 ルートは実行時に動的に追加できます。 以前に定義されたものと同じIDを持つルートは、古いルートを置き換えます。
*RouteBuilder* インスタンスの内部について説明します。
ルート
ルーターは、 from メッセージを to ロケーションに移動するためのルールを定義します。 RouteBuilder を使用して、Java DSLでルートを定義します。 ルートを作成するには、組み込みの RouteBuilder クラスを拡張します。 ルートは from エンドポイントで始まり、エンドポイントへの1つ以上で終わります。 2つの間に、処理ロジックを実装します。 単一の configure メソッド内で任意の数のルートを設定できます。
ルートの作成方法の典型的な例を次に示します-
context.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:DistributeOrderDSL")
.to("stream:out");
}
}
*RouteBuilder* クラスのconfigureメソッドをオーバーライドし、ルーティングとフィルタリングのメカニズムを実装します。 現在のケースでは、エンドポイント *DistributeOrderDSL* から受信した入力を、エンドポイント *stream:out* で指定されたコンソールにリダイレクトします。
言語選択
異なる言語でルートを作成できます。 3つの異なる言語で同じルートがどのように定義されるかの例をいくつか示します-
Java DSL
from ("file:/order").to("jms:orderQueue");
Spring DSL
<route>
<from uri = "file:/order"/>
<to uri = "jms:orderQueue"/>
</route>
Scala DSL
from "file:/order" -> "jms:orderQueue"
フィルター
入力コンテンツの一部を選択するには、フィルターを使用します。 フィルターを設定するには、任意のhttps://camel.apache.org/predicatel[Predicate]実装を使用します。 フィルタリングされた入力は、目的の宛先エンドポイントに送信されます。 この例では、石鹸の注文をすべて除外して、石鹸の注文をまとめて石鹸サプライヤーに送信できるようにします。
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クラスです。
あなたはここのように単一のルーティングで複数の述語を組み合わせることができます-
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スニペットは、Spring XMLを介したいくつかのフィルタリングとともにルートを作成する方法を示しています-
<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>
ルートがどのように構築されるかを見てきたので、エンドポイントを作成するさまざまなテクニックを見ていきます。