第137章 Routebox


Routebox コンポーネント

Camel 2.6 以降で利用可能
Routebox が変更可能
Routebox コンポーネントは今後のリリースで再検討され、さらに簡素化され、より直感的でユーザーフレンドリーなものになります。関連する Context コンポーネントは、より簡単なコンポーネントとして考慮される可能性があります。このコンポーネントは、コンテキスト が優先されるため非推奨になる可能性が あり ます。
routebox コンポーネントを使用すると、自動作成またはユーザーが挿入された Camel コンテキストでホストされる Camel ルートのコレクションにカプセル化およびストラテジーベースの間接サービスを提供する特殊なエンドポイントを作成できます。
Routebox エンドポイントは、Camel ルートで直接呼び出すことができる Camel エンドポイントです。routebox エンドポイントは、以下の主要な機能 * カプセル化を実行します。ブラックボックスとして機能し、内部 Camel コンテキストに保存された Camel ルートのコレクションをホストします。内部コンテキストは routebox コンポーネントの制御下にあり、JVM バインド です。* ストラテジーベースの間接化 - ユーザー定義の内部ルーティングストラテジーまたはディスパッチマップに基づいて、camel ルートとともに routebox エンドポイントに送信される直接ペイロード。* Exchange propagation - routebox エンドポイントによって変更されたエクスチェンジを camel ルートの次のセグメントに転送します。
routebox コンポーネントは、コンシューマーエンドポイントとプロデューサーエンドポイントの両方をサポートします。
プロデューサーエンドポイントは 2 つのフレーバーです。* 受信したリクエストを外部の routebox コンシューマーエンドポイントに送信またはディスパッチするプロデューサーです。内部埋め込み Camel コンテキストでルートを直接呼び出すプロデューサーにより、外部コンシューマーにリクエストを送信しません。
Maven ユーザーは、このコンポーネントの pom.xml に以下の依存関係を追加する必要があります。
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-routebox</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

Copy to Clipboard Toggle word wrap

Camel Routebox エンドポイントの要件

routebox コンポーネントは、必要な複雑な環境での統合を容易にするように設計されています。
  • ルート と の大規模なコレクション
  • さまざまな方法で統合を必要とするエンドポイントテクノロジーのセットが関係します。
このような環境では、Camel ルート間での階層化を効果的に整理することで、統合ソリューションを作成する必要があることがよくあります。
  • 粒度の細かいルートや、統合フォーカスエリアを表す Routebox エンドポイントとして公開される内部または下位レベルのルートの集約コレクション。以下に例を示します。
    Expand
    フォーカスエリア粒度の細かいルートの例
    部門中心HR ルート、営業ルートなど
    サプライチェーンと B2B Focusルート、フィルフィルメントルート、サードパーティーサービスなどの配送
    テクノロジーの焦点データベースルート、JMS ルート、スケジュール済みバッチルートなど
  • 粒度の細かいルート:単数で特定のビジネスや統合パターンを実行するルート。
粒度の細かいルートで Routebox エンドポイントに送信される要求は、要求を内部の詳細なルートに委譲して特定の統合目的を達成し、最終的な内部結果を収集して、粒度の細かいルートで次のステップに進むことができます。

URI 形式

routebox:routeboxname[?options]

Copy to Clipboard Toggle word wrap
URI にクエリーオプションは ?option=value&option=value&.. の形式で追加できます。

オプション

Expand
名前 デフォルト値 説明
dispatchStrategy null インターフェイス org.apache.camel.component.routebox.strategy.RouteboxDispatchStrategyを実装するオブジェクト値と一致する Camel レジストリーのキーを表す文字列
dispatchMap null HashMap<String, String> タイプのオブジェクト値と一致する Camel レジストリーのキーを表す文字列。HashMap キーには、エクスチェンジヘッダー ROUTE_DISPATCH_KEY に設定された値に対して一致する文字列が含まれている必要があります。HashMap 値には、リクエストを転送する必要のある内部ルートコンシューマー URI が含まれる必要があります。
innerContext 自動作成 org.apache.camel.CamelContext 型のオブジェクト値と一致する Camel レジストリーのキーを表す文字列。ユーザーによって CamelContext が提供されていない場合、内部ルートのデプロイのために CamelContext が自動的に作成されます。
innerRegistry null Camel レジストリーのキーを表す文字列は、インターフェイス org.apache.camel.spi.Registry を実装するオブジェクト値と一致します。エンドポイントを作成するために内部ルートで使用されるレジストリー値を使用する場合は、innerRegistry パラメーターを指定する必要があります。
routeBuilders 空のリスト List<org.apache.camel.builder.RouteBuilder> タイプのオブジェクト値に一致する Camel レジストリーのキーを表す文字列。ユーザーが内部ルートに先行する innerContexts を提供しない場合、routeBuilders オプションは内部ルートを含む RouteBuilder の空でないリストとして指定する必要があります。
innerProtocol Direct Routebox コンポーネントによって内部で使用される Protocol。Direct または SEDA にすることができます。Routebox コンポーネントは、現在 JVM にバインドされるプロトコルを提供します。
sendToConsumer true Producer エンドポイントがリクエストを外部 routebox コンシューマーに送信するかどうかを指定します。設定が false の場合、Producer は埋め込みの内部コンテキストを作成し、内部で要求を処理します。
forkContext true Routebox コンポーネントによって内部で使用される Protocol。Direct または SEDA にすることができます。Routebox コンポーネントは、現在 JVM にバインドされるプロトコルを提供します。
threads 20 リクエストを受信するために routebox が使用するスレッドの数。innerProtocol SEDA のみに適用可能な設定
queueSize 無制限 要求を受信する固定サイズキューを作成します。innerProtocol SEDA のみに適用可能な設定

routebox へのメッセージの送受信

リクエストを送信する前に、以下に示すように、必要な URI パラメーターをレジストリーにロードして routebox を適切に設定する必要があります。Spring の場合、必要な Bean が正しく宣言されると、レジストリーは自動的に Camel によって入力されます。

ステップ 1: レジストリーへの内部ルート詳細の読み込み

@Override
protected JndiRegistry createRegistry() throws Exception {
    JndiRegistry registry = new JndiRegistry(createJndiContext());
        
    // Wire the routeDefinitions & dispatchStrategy to the outer camelContext where the routebox is declared
    List<RouteBuilder> routes = new ArrayList<RouteBuilder>();
    routes.add(new SimpleRouteBuilder());
    registry.bind("registry", createInnerRegistry());
    registry.bind("routes", routes);
        
    // Wire a dispatch map to registry
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("addToCatalog", "seda:addToCatalog");
    map.put("findBook", "seda:findBook");
    registry.bind("map", map);
    
    // Alternatively wiring a dispatch strategy to the registry
    registry.bind("strategy", new SimpleRouteDispatchStrategy());

    return registry;
}
    
private JndiRegistry createInnerRegistry() throws Exception {
    JndiRegistry innerRegistry = new JndiRegistry(createJndiContext());
    BookCatalog catalogBean = new BookCatalog();
    innerRegistry.bind("library", catalogBean);        
        
    return innerRegistry;
}
...
CamelContext context = new DefaultCamelContext(createRegistry());

Copy to Clipboard Toggle word wrap
ディスパッチストラテジーを使用するには、以下の例のように org.apache.camel.component.routebox.strategy.RouteboxDispatchStrategy インターフェイスを実装する必要があります。
public class SimpleRouteDispatchStrategy implements RouteboxDispatchStrategy {

    /* (non-Javadoc)
     * @see org.apache.camel.component.routebox.strategy.RouteboxDispatchStrategy#selectDestinationUri(java.util.List, org.apache.camel.Exchange)
     */
    public URI selectDestinationUri(List<URI> activeDestinations,
            Exchange exchange) {
        URI dispatchDestination = null;
            
        String operation = exchange.getIn().getHeader("ROUTE_DISPATCH_KEY", String.class);
        for (URI destination : activeDestinations) {
            if (destination.toASCIIString().equalsIgnoreCase("seda:" + operation)) {
                dispatchDestination = destination;
                break;
            }
        }
            
        return dispatchDestination;
    }
}

Copy to Clipboard Toggle word wrap

ステップ 2: routebox コンシューマーの起動

ルートコンシューマーの作成時に、routeboxUri の # エントリーが CamelContext レジストリーの作成された内部レジストリー、routebuilder リスト、および dispatchStrategy/dispatchMap に一致することに注意してください。すべての routebuilders および関連するルートが内部コンテキストで作成された routebox で起動することに注意してください。
private String routeboxUri = "routebox:multipleRoutes?innerRegistry=#registry&routeBuilders=#routes&dispatchMap=#map";

public void testRouteboxRequests() throws Exception {
    CamelContext context = createCamelContext();
    template = new DefaultProducerTemplate(context);
    template.start();        
     
    context.addRoutes(new RouteBuilder() {
        public void configure() {
            from(routeboxUri)
                .to("log:Routes operation performed?showAll=true");
        }
    });
    context.start();

    // Now use the ProducerTemplate to send the request to the routebox
    template.requestBodyAndHeader(routeboxUri, book, "ROUTE_DISPATCH_KEY", "addToCatalog");
}

Copy to Clipboard Toggle word wrap

ステップ 3: routebox プロデューサーの使用

routebox にリクエストを送信する場合、プロデューサーは内部ルートエンドポイント URI を認識する必要はありません。以下のように、ディスパッチストラテジーまたは dispatchMap で Routebox URI エンドポイントを呼び出すだけです。
要求を正しい内部ルートに送信できるように、ディスパッチマップのキーに一致するキー ROUTE_DISPATCH_KEY (Dispatch Strategy の場合オプション)と呼ばれる特別なエクスチェンジヘッダーを設定する必要があります。
from("direct:sendToStrategyBasedRoutebox")
    .to("routebox:multipleRoutes?innerRegistry=#registry&routeBuilders=#routes&dispatchStrategy=#strategy")
    .to("log:Routes operation performed?showAll=true");

from ("direct:sendToMapBasedRoutebox")
    .setHeader("ROUTE_DISPATCH_KEY", constant("addToCatalog"))
    .to("routebox:multipleRoutes?innerRegistry=#registry&routeBuilders=#routes&dispatchMap=#map")
    .to("log:Routes operation performed?showAll=true");

Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat