¿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?
3 respuestas
Para crear rutas de camello dinámicamente en tiempo de ejecución, debe
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" />
...
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
Camel usa llaves dobles para leer el valor de la propiedad (http://camel.apache.org /properties.html), entonces:
from("{{property1}}")
.to("{{property2}}");
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);
}
};
}
}
Nuevas preguntas
routes
Preguntas sobre la asignación de URL a controladores y acciones.