¿Hay alguna solución para crear una ruta en camello dinámicamente, en tiempo de ejecución? De manera común, definimos explícitamente una ruta en camello como:

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

Sin embargo, quiero crear algunas rutas en tiempo de ejecución cuando sea necesario. Por ejemplo, desde un archivo de propiedades, la aplicación leerá las propiedades y creará las rutas utilizando las propiedades. Tendré el código:

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

Si existe un archivo de propiedad más, la aplicación debe crear dinámicamente otra ruta y agregarla en el contexto de camello. ¿Es eso posible, alguien me puede ayudar?

0
Erick 22 ene. 2018 a las 14:23

3 respuestas

La mejor respuesta

Para crear rutas de camello dinámicamente en tiempo de ejecución, debe

  1. Consumir archivos de configuración 1 por 1

Esto puede ser tan simple como configurar un punto final de archivo para consumir archivos, p.

<from uri="file:path/to/config/files?noop=true"/>
    <bean ref="pleaseDefineThisSpringBean" method="buildRoute" />
    ...
  1. Crear ruta por archivo de configuración

Agregue una nueva ruta a CamelContext con la ayuda de un routeBuilder

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

Nota: La función "addRoutes" anulará la ruta existente del mismo ID de ruta

1
hk6279 1 feb. 2018 a las 07:52

Camel usa llaves dobles para leer el valor de la propiedad (http://camel.apache.org /properties.html), entonces:

from("{{property1}}") 
        .to("{{property2}}");
1
MaciekGrynda 22 ene. 2018 a las 11:28

Sí, por supuesto que puedes hacerlo. No estoy seguro de qué quieres decir exactamente con "ejecución a tiempo".
1. Si te estás refiriendo a algo como que quieres crear rutas al no codificarlo en código java, pero quieres tomarlo del archivo de propiedades, entonces es bastante sencillo. Puede conectar automáticamente las propiedades en su clase donde está creando rutas y usarlas como cualquier otra variable.
por ejemplo

@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. Si desea agregar rutas dinámicamente una vez que el contexto de la aplicación ya se ha inicializado, puede hacerlo así

@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);
     }
   };
  } 
}
2
pvpkiran 22 ene. 2018 a las 14:38
48380456