【问题标题】:Add camel route at runtime in Java在 Java 中运行时添加骆驼路线
【发布时间】:2012-05-14 03:39:32
【问题描述】:

如何在 Java 运行时添加骆驼路线?我找到了一个 Grails 示例,但我已经用 Java 实现了它。

我的 applicationContext.xml 已经有一些预定义的静态路由,我想在运行时向它添加一些动态路由。 可能吗? 因为包含动态路由的唯一方法是编写 route.xml,然后将路由定义加载到上下文中。它将如何在现有的静态路由上工作? Route at runtime

【问题讨论】:

    标签: spring apache-camel


    【解决方案1】:

    你可以简单地在 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

    【讨论】:

    • 感谢您的回复,但我正在寻找更可配置的方法。在我的情况下,外部应用程序可以决定我的应用程序的路由,我正在寻找更多可配置的解决方案来解决这个问题
    • 上面的解决方案对我来说看起来很可配置。您希望完整的路线是动态的吗?那你就只能用xml了。
    • 我什至制作了一个 javascript 用户界面,通过 EIP 构建块以图形方式设计路由,这些构建块本质上是在 java 中动态构建 DSL 路由。也可以很容易地动态管理路由,部署、启动、停止、删除等。Camel 中的 Java API 非常灵活。
    • @Petter 听起来很棒,有链接吗? :)
    • @Petter,对我来说听起来也很棒。有机会让它开源吗?
    【解决方案2】:

    @Himanshu, 请查看动态路由选项(即路由单),它可以帮助您根据特定条件动态路由到不同的“目的地”。

    查看骆驼站点的动态路由器帮助链接;

    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;
    }
    

    希望对你有帮助...

    谢谢。

    【讨论】:

      【解决方案3】:

      这样的解决方案可能是:

      定义路线:

      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()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-05
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多