311.3. 他の XML ファイルからルートをインポートする方法
Camel 2.3 の時点で利用可能
Xml 設定 を使用して Camel でルートを定義する場合、他の XML ファイルでいくつかのルートを定義したい場合があります。たとえば、多くのルートがあり、一部のルートが個別の XML ファイルにあると、アプリケーションを維持するのに役立つ場合があります。必要に応じて簡単にインポートできる、共通の再利用可能なルートを他の XML ファイルに保存することもできます。
Camel 2.3 では、新しい <routeContext/>
タグで <camelContext/>
の外側でルートを定義できるようになりました。
注意: <routeContext> を使用すると、それらは分離され、既存の <onException>、<intercept>、<dataFormats>、および <camelContext> で定義された同様のクロスカット機能を再利用できません。つまり、<routeContext> は現在分離されています。これは Camel 3.x で変更される可能性があります。
たとえば、次のように、いくつかのルートを含む myCoolRoutes.xml
という名前のファイルを作成できます。
myCoolRoutes.xml
次に、CamelContext を含む XML ファイルで、Spring を使用して myCoolRoute.xml
ファイルをインポートできます。<camelContext/>
内では、以下に示すように、ID で <routeContext/>
を参照できます。
また、CamelContext 内にルートを持ち、RouteContext で外部化することもできます。
<routeContextRef/> は
好きなだけ持つことができます。
再利用可能なルート
<routeContext/>
で定義されたルートは、複数の <camelContext/>
で再利用できます。ただし、再利用されるのはその定義だけです。実行時に、各 CamelContext は定義に基づいてルートの独自のインスタンスを作成します。
311.3.1. テスト時間の除外。
テスト時に、テストシナリオに適用できない、または有用でない一致するルートを初期化から選択的に除外できることが望ましい場合がよくあります。たとえば、Spring コンテキストファイル routes-context.xml と、org.example.routes パッケージ内の 3 つのルートビルダー RouteA、RouteB、および RouteC を使用できます。packageScan 定義は、これら 3 つのルートすべてを検出して初期化します。
RouteC はテストシナリオには適用できず、テスト中に多くのノイズが発生するとします。この特定のテストからこのルートを除外できると便利です。これを可能にするために、SpringTestSupport クラスが変更されました。単一のクラスまたはクラスの配列を除外するためにオーバーライドできる 2 つのメソッド (excludedRoute および excludeRoutes) を提供します。
public class RouteAandRouteBOnlyTest extends SpringTestSupport { @Override protected Class excludeRoute() { return RouteC.class; } }
spring による camelContext 初期化にフックして MyExcludedRouteBuilder.class を除外するには、spring コンテキストの作成をインターセプトする必要があります。createApplicationContext をオーバーライドして Spring コンテキストを作成する場合、getRouteExclusiveApplicationContext() メソッドを呼び出して、除外を処理する特別な親 Spring コンテキストを提供します。
@Override protected AbstractXmlApplicationContext createApplicationContext() { return new ClassPathXmlApplicationContext(new String[] {"routes-context.xml"}, getRouteExcludingApplicationContext()); }
RouteC は初期化から除外されます。同様に、RouteC のみをテストする別のテストでは、RouteB と RouteA をオーバーライドして除外できます。
@Override protected Class[] excludeRoutes() { return new Class[]{RouteA.class, RouteB.class}; }