Apache Camel: uso con Spring

Ahora recrearemos la aplicación del capítulo anterior usando Spring. Esto nos dará una idea de cómo crear enrutamiento Camel en XML en lugar de DSL.

Crear nuevo proyecto

Crear un nuevo Maven proyecto y especifique lo siguiente:

GroupId: BasketWithSpring
ArtifactId: BasketWithSpring

Seleccione la ubicación predeterminada para su proyecto o, si lo prefiere, especifique el directorio de su elección.

Agregar dependencias

Además de las dependencias centrales que usó en la aplicación anterior, necesita agregar algunas dependencias más para usar Spring. Las dependencias se agregan en pom.xml. Ahora, abra pom.xml y agregue las siguientes dependencias:

<dependencies>
   ...
   <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.3.RELEASE</version>
   </dependency>
   
   <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-pool</artifactId>
      <version>5.15.2</version>
   </dependency>
   
   <dependency>
      <groupId>org.apache.activemq</groupId>
      <artifactId>activemq-pool</artifactId>
      <version>5.15.1</version>
   </dependency>
   
   <dependency>
      <groupId>org.apache.camel</groupId>
      <artifactId>camel-spring</artifactId>
      <version>2.15.1</version>
   </dependency>
</dependencies>

Creando Java DSL para Spring

Creemos ahora una nueva clase Java llamada DistributeOrderXML. Agregue el siguiente código:

public class DistributeOrderXML {
   public static void main(String[] args) throws Exception {
      ApplicationContext appContext = new ClassPathXmlApplicationContext(
         "SpringRouteContext.xml");
      CamelContext camelContext = SpringCamelContext.springCamelContext(appContext, false);
      try {
         camelContext.start();
         ProducerTemplate orderProducerTemplate = camelContext.createProducerTemplate();
         InputStream orderInputStream = new FileInputStream(ClassLoader.getSystemClassLoader()
            .getResource("order.xml").getFile());
         
         orderProducerTemplate.sendBody("direct:DistributeOrderXML", orderInputStream);
      } finally {
         camelContext.stop();
      }
   }
}

En el main método, primero creamos una instancia de ApplicationContext, que es la interfaz central dentro de una aplicación Spring. En su constructor, especificamos el nombre del archivo XML que contiene nuestra información de enrutamiento y filtrado.

ApplicationContext appContext = new ClassPathXmlApplicationContext(
   "SpringRouteContext.xml");

A continuación, creamos CamelContext especificando lo anterior creado ApplicationContext en su parámetro.

CamelContext camelContext = SpringCamelContext.springCamelContext(appContext, false);

En este punto, nuestro enrutamiento y filtrado está configurado. Por lo tanto, comenzamosCamelContext usando su startmétodo. Como en el caso anterior, definimos el Endpoint para cargar el archivo order.xml e iniciamos el procesamiento. Ahora, entendamos cómo se define el enrutamiento en XML.

Crear contexto de aplicación

Agregue un nuevo archivo XML al proyecto y llámelo SpringRouteContext.xml. Corta y pega el siguiente contenido en este archivo.

<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://camel.apache.org/schema/spring
      http://camel.apache.org/schema/spring/camel-spring.xsd ">
   <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>
</beans>

Aquí, definimos la consulta xpath de la siguiente manera, tenga en cuenta que ahora seleccionamos todos los pedidos para "aceite".

<xpath>//order[@product = 'Oil']/items</xpath>

Los puntos finales de salida son múltiples. El primer punto final especifica elorder carpeta y el segundo especifica la consola.

<to uri = "file:src/main/resources/order/"/>
<to uri = "stream:out"/>

Ejecute la aplicación.

Resultados de la prueba

Cuando ejecute la aplicación, verá el siguiente resultado en la pantalla.

<items>
   <item>
      <Brand>Cinthol</Brand>
      <Type>Original</Type>
      <Quantity>4</Quantity>
      <Price>25</Price>
   </item>
   <item>
      <Brand>Cinthol</Brand>
      <Type>Lime</Type>
      <Quantity>6</Quantity>
      <Price>30</Price>
   </item>
</items>

Revisar la ordercarpeta en la ruta especificada por usted. Encontrará un archivo recién creado que contiene el código XML anterior.

Conclusión

Camel proporciona un marco listo para usar que implementa EIP para facilitar sus proyectos de integración. Admite la codificación en lenguajes específicos de dominio y también el uso de XML.