【问题标题】:Dynamic routing Apache Camel动态路由 Apache Camel
【发布时间】:2018-07-01 00:25:33
【问题描述】:

是否有一些解决方案可以动态创建骆驼路线,及时执行?通常,我们将骆驼路线明确定义为:

from("direct:a")           
            .to("direct:b");

但是,我想在需要时创建一些及时执行的路线。例如,从属性文件中,应用程序将读取属性并使用属性创建路由。我要代码:

from({property1}) 
            .to({property2});

如果还存在一个属性文件,应用程序必须动态创建另一个路由并将其添加到骆驼上下文中。这可能吗,有人可以帮助我吗?

【问题讨论】:

    标签: routes apache-camel


    【解决方案1】:

    要在运行时动态创建骆驼路线,您需要

    1. 逐个使用配置文件

    这可以像设置文件端点来使用文件一样简单,例如

    <from uri="file:path/to/config/files?noop=true"/>
        <bean ref="pleaseDefineThisSpringBean" method="buildRoute" />
        ...
    
    1. 通过配置文件创建路由

    在 routeBuilder 的帮助下向 CamelContext 添加新路由

    public void buildRoute(Exchange exchange) {
        // 1. read config file and insert into variables for RouteBuilder
        // 2. create route
        SpringCamelContext ctx = (SpringCamelContext)exchange.getContext();
        ctx.addRoutes(createRoutebyRouteBuilder(routeId, from_uri, to_uri));
    }
    
    protected static RouteBuilder createRoutebyRouteBuilder(final String routeId, final String from_uri, String to_uri) throws Exception{
    
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
    
                from (from_uri)
                    .routeId(routeId)
                    .to(to_uri);
            }
        };
    }
    

    注意:函数“addRoutes”会覆盖已有的相同routeId的路由

    【讨论】:

      【解决方案2】:

      是的,当然可以。我不确定您所说的“及时执行”到底是什么意思。
      1.如果你指的是你想通过不在java代码中硬编码来创建路由,但想从属性文件中获取它,那么它非常简单。您可以在创建路由的类中自动装配属性并将它们用作任何其他变量。
      例如

      @Configuration
      public class CamelConfig {
      
        @Value("${from.route}")
        String fromRoute;
      
        @Value("${to.route}")
        String toRoute;
      
        @Bean
        public RoutesBuilder routes() {
      
          return new SpringRouteBuilder() {
      
            @Override
            public void configure() throws Exception {
              from(fromRoute).to(toRoute);
            }
          };
        }
      }
      

      2。如果您想在应用程序上下文已经初始化后动态添加路由,那么您可以这样做

      @Component
      public class SomeBean {
      
        @Value("${from.route}")
        String fromRoute;
      
      
        @Value("${to.route}")
        String toRoute;
      
        @Autowired
        ApplicationContext applicationContext;
      
        public void someMethod() {
      
          CamelContext camelContext = (CamelContext) context.getBean(CamelContext.class);
           new SpringRouteBuilder() {
           @Override
           public void configure() throws Exception {
             from(fromRoute).to(toRoute);
           }
         };
        } 
      }
      

      【讨论】:

      • 我们如何在 JavaDSL 中实现第二个选项,我没有使用 spring
      【解决方案3】:

      Camel 使用双括号来读取属性值 (http://camel.apache.org/properties.html),所以:

      from("{{property1}}") 
              .to("{{property2}}");
      

      【讨论】:

        猜你喜欢
        • 2019-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多