Ejemplo: Apache Camel con Blueprint

Aquí presentamos un proyecto Apache Camel Blueprint completamente funcional. Proporciona código de ejemplo para construir rutas, crear beans e implementar en ServiceMix con B...

Aquí presentamos un proyecto Apache Camel Blueprint completamente funcional. Proporciona código de ejemplo para construir rutas, crear beans e implementar en ServiceMix con Blueprint.

Plano

En resumen, Blueprint es muy parecido a Spring. En realidad, se parece mucho a Spring, pero con ligeras diferencias. La especificación Blueprint Container fue creada por OSGi Alliance (utilizando Eclipse Gemini Blueprint como implementación de referencia) para proporcionar aplicaciones con una mejor separación de módulos, la capacidad de agregar, eliminar y actualizar dinámicamente módulos en un sistema en ejecución, la capacidad de implementar múltiples versiones de un módulo simultáneamente (y hacer que los clientes se vinculen automáticamente con el apropiado) y un modelo de servicio dinámico. Blueprint está fuertemente influenciado por Spring y, por lo tanto, implementa muchas funciones de Spring, aunque está más orientado a las aplicaciones OSGi.

El archivo Blueprint está escrito en XML y generalmente se encuentra en el directorio OSGI-INF/blueprint/, que es su ubicación predeterminada. Este directorio se empaquetará con el archivo JAR resultante, y los contenedores OSGi como ServiceMix buscarán allí de forma predeterminada para buscar uno o más archivos Blueprint. Esto no parece estar muy bien documentado en ninguna parte, pero tenga en cuenta que no es necesario que los archivos Blueprint se empaqueten dentro de un archivo JAR. Pueden ser archivos independientes que se cargan en un contenedor OSGi (es decir, se colocan en el directorio deploy/ de ServiceMix) por sí mismos. Esto puede ser extremadamente útil para reconfigurar rutas sobre la marcha.

El Código

Aquí, le mostraremos cómo crear una ruta Camel simple e implementable utilizando una combinación de Blueprint (para la especificación de rutas) y Java (para el procesamiento de mensajes). El directorio del proyecto está estructurado de la siguiente manera:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
wikihtp-example-blueprint/
    pom.xml
    src/
        main/
            java/
                com.wikihtp.example.WeatherProcessor.java
            resources/
                OSGI-INF/
                    blueprint/
                        blueprint-example.xml
        test/

Usar Experto para paquetes OSGi es muy conveniente, principalmente debido al maven-bundle-plugin proporcionado creado por el proyecto Apache Felix. Este complemento, dadas algunas configuraciones en el archivo pom.xml, generará su archivo MANIFEST.MF para usted usando [BND] (http://www.aqute.biz/Bnd/Bnd), ahorrándose muchos dolores de cabeza.

El archivo blueprint-example.xml contiene nuestras definiciones de ruta Camel en XML, que es capaz del mismo nivel de detalle que el lenguaje específico de dominio Java (DSL). El contenido se ve así:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
            http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
            http://cxf.apache.org/blueprint/jaxws http://cxf.apache.org/schemas/blueprint/jaxws.xsd
            http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd
           ">
 
  <bean id="weatherProcessor" class="com.wikihtp.example.WeatherProcessor" />
    
  <camelContext xmlns="http://camel.apache.org/schema/blueprint">

    <route>
      <from uri="timer:fetch?period=3600s&amp;delay=5s" />
      <to uri="direct:trigger" />
    </route>
    
    <route>
      <from uri="direct:trigger" />
      <to uri="weather:foo?location=Omaha,United States&amp;period=7 days&amp;units=IMPERIAL" />
      <process ref="weatherProcessor" />
      <to uri="log:com.wikihtp.example?level=DEBUG" />
      <to uri="file:/Users/scott/Desktop/weather?fileName=omaha.txt" />
    </route>

  </camelContext>
 
</blueprint>

Todos los archivos Blueprint comienzan con la etiqueta <blueprint> y generalmente contienen la etiqueta <camelContext> para especificar rutas Camel. En este ejemplo, nuestra ruta es activada por un temporizador simple cada hora (3600 segundos), en el que luego obtendrá el pronóstico de 7 días para Omaha, NE EE. UU. y guardará el resultado en un archivo en el escritorio. Antes de guardar los datos, se enrutan a través de un procesador, que se define como un bean de Java antes de que comience la etiqueta <camelContext>. Este bean, que se muestra a continuación, implementa la interfaz org.apache.camel.Processor y extrae solo los datos que queremos de los datos meteorológicos JSON devueltos. Analiza el JSON y devuelve una cadena con el formato "[fecha]: [temperatura] Celsius" para guardarla en el archivo.

En el sitio web de Apache Camel, casi todas las páginas de componentes de Camel proporcionan ejemplos tanto en Java como en Blueprint, lo que hace que el desarrollo de rutas sea tan fácil, si no más, en Blueprint. Me resultó difícil encontrar muchos ejemplos de código Blueprint, a pesar de su popularidad, por lo que si alguna vez tiene dudas sobre las capacidades de Blueprint, suponga que todo lo que funcione en Spring funcionará en Blueprint, más el funciones/esquemas adicionales específicos de Camel.

Usando el Código

Si desea probar esto usted mismo, puede descargar el código a continuación. Para ejecutarlo, debe tener instalados Apache Maven y Apache ServiceMix. Cree el proyecto navegando al directorio wikihtp-example-blueprint, ejecutando mvn package y, finalmente, colocando el archivo JAR resultante en el directorio deploy/ de ServiceMix. Dado que el JAR resultante es un paquete OSGi, no contendrá sus dependencias como cabría esperar. También deberá colocar las siguientes dependencias en la carpeta deploy/:

  • org.apache.felix.eventadmin-1.3.2.jar
  • camello-tiempo-2.12.3.jar
  • camello-core-osgi-2.12.3.jar -org.osgi.core-1.0.0.jar
  • json-20140107.jar

Debería poder encontrar todos estos archivos JAR en su repositorio Maven local (~/.m2/) después de compilar el proyecto con Maven.

Y finalmente, para ejecutar el paquete, inicie ServiceMix ejecutando servicemix o start desde [ServiceMix Home Dir]/bin. En unos segundos, debería ver aparecer un directorio weather/ en el escritorio que contiene un archivo con el pronóstico del tiempo para el día siguiente en Omaha.

Recursos