13

Javaで実行時にラクダルートを追加するにはどうすればよいですか?Grailsの例を見つけましたが、Javaで実装しました。

私のapplicationContext.xmlにはすでにいくつかの事前定義された静的ルートがあり、実行時にいくつかの動的ルートを追加したいと思います。出来ますか?動的ルートを含める唯一の方法は、route.xmlを記述してから、ルート定義をコンテキストにロードすることです。既存の静的ルートでどのように機能しますか? 実行時にルーティング

4

3 に答える 3

24

CamelContextでいくつかの異なるAPIを呼び出すだけで、ルートを追加できます...このようなもの

context.addRoutes(new MyDynamcRouteBuilder(context, "direct:foo", "mock:foo"));
....
private static final class MyDynamcRouteBuilder extends RouteBuilder {
    private final String from;
    private final String to;

    private MyDynamcRouteBuilder(CamelContext context, String from, String to) {
        super(context);
        this.from = from;
        this.to = to;
    }

    @Override
    public void configure() throws Exception {
        from(from).to(to);
    }
}

完全な例については、この単体テストを参照してください。

https://svn.apache.org/repos/asf/camel/trunk/camel-core/src/test/java/org/apache/camel/builder/AddRoutesAtRuntimeTest.java

于 2012-05-04T16:27:00.500 に答える
1

@Himanshu、特定の条件に基づいてさまざまな「宛先」に動的にルーティングするのに役立つ可能性のあるdynamicrouteオプション(つまり、ルーティングスリップ)を確認してください。

キャメルサイトのダイナミックルーターヘルプリンクを確認してください。

http://camel.apache.org/dynamic-router.html

from("direct:start")
    // use a bean as the dynamic router
    .dynamicRouter(method(DynamicRouterTest.class, "slip"));

そして、スリップ法の範囲内で;

/**
 * Use this method to compute dynamic where we should route next.
 *
 * @param body the message body
 * @return endpoints to go, or <tt>null</tt> to indicate the end
 */
public String slip(String body) {
    bodies.add(body);
    invoked++;

    if (invoked == 1) {
        return "mock:a";
    } else if (invoked == 2) {
        return "mock:b,mock:c";
    } else if (invoked == 3) {
        return "direct:foo";
    } else if (invoked == 4) {
        return "mock:result";
    }

    // no more so return null
    return null;
}

それが役に立てば幸い...

ありがとう。

于 2016-08-25T00:01:16.050 に答える
0

そのような解決策の1つは次のとおりです。

ルートを定義します。

private RouteDefinition buildRouteDefinition() {
    RouteDefinition routeDefinition = new RouteDefinition();
    routeDefinition.from(XX).to(ZZ); // define any route you want
    return routeDefinition;
}

モデルコンテキストを取得し、ルートを作成します。

CamelContext context = getContext();
ModelCamelContext modelContext = context.adapt(ModelCamelContext.class);
modelContext.addRouteDefinition(routeDefinition);

ラクダのコンテキストを取得する方法は他にもあります。いくつか例を挙げると:

  • プロセッサでは、次を使用できますexchange.getContext()
  • RouteBuilderリファレンスを通じて、次を使用できますrouteBuilder.getContext()
于 2021-09-08T11:49:47.153 に答える