Apache Camel - CamelContext

CamelContext proporciona acceso a todos los demás servicios en Camel como se muestra en la siguiente figura:

Echemos un vistazo a los distintos servicios. losRegistryEl módulo por defecto es un registro JNDI, que contiene el nombre de los distintos Javabeans que utiliza su aplicación. Si usa Camel con Spring, esta será la primaveraApplicationContext. Si usa Camel en un contenedor OSGI, esto seráOSGI registry. losType converterscomo su nombre indica, contiene los diversos convertidores de tipo cargados, que convierten su entrada de un formato a otro. Puede utilizar los convertidores de tipo integrados o proporcionar su propio mecanismo de conversión. losComponentsEl módulo contiene los componentes utilizados por su aplicación. Los componentes se cargan mediante descubrimiento automático en elclasspathque especifique. En el caso del contenedor OSGI, estos se cargan cada vez que se activa un nuevo paquete. Ya hemos discutido elEndpoints y Routesen los capítulos anteriores. losData formats contiene los formatos de datos cargados y finalmente el Languages módulo representa los idiomas cargados.

El fragmento de código aquí le dará una idea de cómo un CamelContext se crea en una aplicación Camel -

CamelContext context = new DefaultCamelContext();
try {
   context.addRoutes(new RouteBuilder() {
      // Configure filters and routes
   }
}
);

los DefaultCamelContext La clase proporciona una implementación concreta de CamelContext. EnaddRoutes método, creamos una instancia anónima de RouteBuilder. Puede crear variosRouteBuilderinstancias para definir más de un enrutamiento. Cada ruta en el mismo contexto debe tener un ID único. Las rutas se pueden agregar dinámicamente en el tiempo de ejecución. Una ruta con la misma ID que la definida anteriormente reemplazará a la ruta anterior.

¿Qué va dentro del RouteBuilder La instancia se describe a continuación.

Rutas

El enrutador define la regla para mover el mensaje from a un toubicación. Tu usasRouteBuilderpara definir una ruta en Java DSL. Creas una ruta extendiendo el incorporadoRouteBuilderclase. La ruta comienza con unfrompunto final y termina en uno o más puntos finales. Entre los dos, implementa la lógica de procesamiento. Puede configurar cualquier cantidad de rutas dentro de una solaconfigure método.

Aquí hay un ejemplo típico de cómo se crea una ruta:

context.addRoutes(new RouteBuilder() {
   @Override
   public void configure() throws Exception {
      from("direct:DistributeOrderDSL")
      .to("stream:out");
   }
}

Anulamos el método de configuración de RouteBuilderclass e implementar nuestro mecanismo de enrutamiento y filtrado en él. En el caso actual, redirigimos la entrada recibida del EndpointDistributeOrderDSL a la consola, que es especificada por el Endpoint stream:out.

Elección de idioma

Puede crear las rutas en diferentes idiomas. A continuación se muestran algunos ejemplos de cómo se define la misma ruta en tres idiomas diferentes:

DSL de Java

from ("file:/order").to("jms:orderQueue");

DSL de primavera

<route>
   <from uri = "file:/order"/>
   <to uri = "jms:orderQueue"/>
</route>

Scala DSL

from "file:/order" -> "jms:orderQueue"

Filtros

Utiliza el filtro para seleccionar una parte del contenido de entrada. Para configurar un filtro, usa cualquier implementación de Predicado arbitraria . La entrada filtrada se envía a su punto final de destino deseado. En este ejemplo, filtramos todos los pedidos de jabón para que puedan enviarse colectivamente a un proveedor de jabón.

from("direct:DistributeOrderDSL")
   .split(xpath("//order[@product = 'soaps']/items"))
      .to("stream:out");

En el ejemplo, hemos utilizado xpathpredicado para el filtrado. Si prefiere usar la clase Java para el filtrado, use el siguiente código:

from("direct:DistributeOrderDSL")
   .filter()
      .method(new Order(),"filter")
         .to("stream:out");

los Order es su clase Java personalizada con su propio mecanismo de filtrado.

Puede combinar varios predicados en un solo enrutamiento como aquí:

from("direct:DistributeOrderDSL")
   .choice()
      .when(header("order").isEqualTo("oil"))
         .to("direct:oil")
      .when(header("order").isEqualTo("milk"))
         .to("direct:milk")
      .otherwise()
         .to("direct:d");

Así que ahora todos los pedidos de "aceite" irán al vendedor de aceite, los pedidos de "leche" irán al vendedor de leche y el resto a un grupo común.

Procesador personalizado

También puede utilizar el procesamiento personalizado. El siguiente ejemplo crea un procesador personalizado llamadomyCustomProcessor y lo usa en el generador de rutas.

Processor myCustomProcessor = new Processor() {
   public void process(Exchange exchange) {
      // implement your custom processing
   }
};
RouteBuilder builder = new RouteBuilder() {
   public void configure() {
      from("direct:DistributeOrderDSL")
      .process(myProcessor);
   }
};

Puede usar procesadores personalizados junto con opciones y filtros para obtener un mejor control de su mediación y enrutamiento.

from("direct:DistributeOrderDSL")
   .filter(header("order").isEqualTo("milk"))
      .process(myProcessor);

Usando XML

Las rutas pueden definirse en XML más voluminoso, si lo prefiere. El siguiente fragmento de XML muestra cómo crear una ruta junto con algunos filtros a través de Spring XML:

<camelContext xmlns = "http://camel.apache.org/schema/spring">
   <route>
      <from uri = "direct:DistributeOrderXML"/>
      <log message = "Split by Distribute Order"/>
      <split>
         <xpath>//order[@product = 'Oil']/items</xpath>
         <to uri = "file:src/main/resources/order/"/>
         <to uri = "stream:out"/>
      </split>
   </route>
</camelContext>

Habiendo visto cómo se construyen las rutas, ahora veremos las diversas técnicas de creación de Endpoints.