JBossESB y JBDS

1
10708

Introducción a JBossESB y JBoss Developer Studio (JBDS)

Lo primero, como casi siempre, el enlace a los fuentes:

Introducción

Existen una gran cantidad de soluciones ESB open source, algunas de ellas: Service Mix, MuleESB, WSO2 ESB, OpenESB y otras tantas
de pago (algunas de ellas): WebSphere Message Broker, SAG ESI etc… .

En este caso nos vamos a fijar en la solución de JBoss: JBossESB.

Instalación de JBossESB en JBossAS

En este tutorial doy por hecho que tenéis instalada una Java 6 (y JAVA_HOME configurada) y «ant» (yo tengo a versión 1.8.2)

Antes de poder instalar JBossESB, necesitamos un servidor de aplicaciones donde correrlo. Lo instalaremos en JBossAS 5.1.0, ya que en este servidor está muy probado.
Podemos descargarlo desde aquí.

Seleccionad jboss-5.1.0.GA-jdk6.zip

Ahora debemos descargar alguna distribución de JBossESB. Podemos descargarlo desde aquí.
De las tres distribuciones que aparecen, elegiremos JBossESB 4.10 Binary (esta es la instalación «standalone»):

Descargadlo y descomprimidlo en algún lugar del disco (no lo descomprimáis dentro de la instalación de JBossAS).

Vamos ahora a instalar o desplegar JBossESB en e JBossAS que hemos instalado antes. Para ello, seguid los siguientes pasos:

  1. Abrid una shell y colocáos en el directorio install de la distribución de JbossESB. Haced una copia del fichero «deployment.properties-example» llamándole «deployment.properties» y editadlo, configurando las siguientes propiedades:

       org.jboss.esb.server.home=/Developer/jboss-5.1.0.GA
       org.jboss.esb.server.config=all

    La primera propiedad indica la ruta a la instalación de JBossAS (en mi caso es esa). La segunda propiedad indica la configuración de JBossAS que queremos arrancar. Elegimos «all» para que se instale en esta configuración. Si queréis, podéis hacer una copia de seguridad de la configuración «all» de JBossAS, porque va a ser modificada durante la instalación.
  2. Ahora, desde la consola (situados en el directorio «install» de JBossESB), ejecutad:

       ant deploy

Si observáis la ejecución de la tarea ant, veréis que se han instalado en JBossAS:

  • esb.deployer: Permite desplegar ficheros .esb
  • jbossesb-registry.sar: Servicio que gestiona la integración con el registro o repositorio de servicios
  • jbossesb.esb: Soporte de mensajes
  • jbpm.esb: Integración con JBPM
  • jbrules.esb: Integración con JBoss Rules
  • smooks.esb: Integración con Smooks (transformación de mensajes y enrutamiento)
  • soap.esb: Soporte para WebServices
  • spring.esb: Soporte para Spring

Ahora, únicamente nos queda arrancar el servidor de aplicaciones, para ver si todo ha ido bien. Para eso, ejecutamos el «run.sh» que se encuentra en el directorio «bin» del JBossAS (arrancaremos la configuración o profile de «all» que es la que hemos apañado con JBossESB):

   run.sh -c all

Podemos entrar en la consola de administración del servidor JBoss
(usuario: admin clave: admin)

Desplegando servicios en JBossESB. Ficheros «.esb»

La forma en la que crearemos servicios para ser desplegados en JBossESB será a través de ficheros «.esb». Para permitir este despliegue, durante la instalación se incluyó el esb.deployer.

La anatomía de este tipo de ficheros es similar al de todos los ficheros desplegables en JBossAS, es decir: un fichero (comprimido) o carpeta (exploded) con una estructura fija, que contiene las clases necesarias para su ejecución así como los ficheros descriptores y de configuración que sean necesarios. Lo que seguro que contendrá un archivo «.esb» será un descriptor denominado jboss-esb.xml dentro de una carpeta «META-INF».

Nos vamos a basar en los ejemplos que incorpora JBossESB para realizar nuestra primera aplicación. Todos los ejemplos están basados en una serie de propiedades comunes que debemos configurar en un fichero «quickstart.properties». Aquí están los pasos que deberemos dar para desplegar nuestra primera aplicación en JBossESB (todas las rutas que se indican tienen como raíz la ruta donde descomprimísteis JBossESB):

  1. Copiad el fichero «samples/quickstarts/conf/quickstarts.properties-example» en la misma ruta con el nombre: «samples/quickstarts/conf/quickstarts.properties»
  2. Editad el fichero «quickstarts.properties» indicando las siguientes propiedades:

       org.jboss.esb.server.home=/Developer/jboss-5.1.0.GA
       org.jboss.esb.server.config=all
       jbpm.console.username=admin
       jbpm.console.password=admin

  3. Colocáos en «samples/quickstarts/helloworld» (nada se puede empezar sino es con un Hello World) y ejecutad:

       ant deploy

    Una vez ejecutado, podéis comprobar en la consola de JBossAS que os indicará que el despliegue se ha hecho correctamente:

Vamos a ejecutar los ejemplos que vienen en «helloworld». Para ejecutarlos debemos seguir en la ruta:
«samples/quickstarts/helloworld». El primer ejemplo se ejecuta con:

   ant runtest

Este ejemplo crea un mensaje JMS y lo envía a una cola. Al llegar el mensaje a la cola, un «gateway listener» (un adaptador) recoge el mensaje, lo «encapsula en un ESBMessage» (mensaje que entiende JBossESB) y lo envía a un listener «ESB-Aware». A continuación, el mensaje se pinta en la consola del servidor:

El segundo ejemplo se ejecuta con:

   ant sendesb

Aquí se crea un mensaje «ESB-aware» (mensaje que entiende JBossESB) y se envía directamente al listener «ESB-Aware». A continuación, el mensaje se pinta en la consola del servidor:

Una vez desplegado y ejecutado el ejemplo, podemos quitarlo de despliegue ejecutando:

   ant undeploy

Instalación de JBDS (JBoss Developer Studio)

Es muy recomendable si vamos a crear aplicaciones para JBossESB utilizar algún editor que nos facilite la creación de los ficheros .esb y la edición de los diferentes descriptores. Para ello nada mejor que el propio IDE que proporciona JBoss: JBoss Developer Studio (está montado sobre un eclipse). . Será necesario previamente registrarse (Pulsad en «REGISTER FOR FREE HERE») (si no lo estáis ya). Al final llegaréis a una página similar a esta. Seleccionad vuestra distribución en función de las características de vuestro sistema (yo he elegido la marcada en rojo):

Una vez descargado el fichero, ejecutad el instalador (suponemos que estamos en la shell en el directorio donde habéis descargado el fichero):

   java -jar jbdevstudio-product-macosx-cocoa-x86_64-4.1.2.v201201.jar

Este comando arrancará el instalador (En mi caso el fichero se llama así) y seguir el «wizard».
Hay que seleccionar la JVM, el directorio de instalación y el JBossAS que hemos instalado previamente:

Una vez seleccionada empieza la instalación:

Una vez instalado, sólo hay que ejecutarlo. Seleccionad el workspace y a correr:

Vamos a configurar ahora nuestro JBoss ESB (el que hemos instalado sobre JBossAS):

  1. Una vez arrancado (cerrad el Welcome) y seleccionad la perspectiva «Java».
  2. Seleccionad «Jboss Developer Studio > Preferences > JBoss ESB Runtimes»:

    Notad que he seleccionado la «home» de JBossAS y la configuración «all» (exactamente donde hemos desplegado JBossESB)

  3. Una vez hecho esto, ya podemos parar el servidor JBoss (si aún lo tenéis arrancado), porque ahora podemos gestionarlo todo a través del JBDS. Sólo nos falta configurar la vista de servers: seleccionad «Window > Show View > Other > Servers»:

    En la vista de «Servers» ya podréis ver el JBossAS configurado correctamente para ser ejecutado (Botón derecho sobre el servidor y start):

    Una vez que ya tenemos todo «preparadito» para empezar a entrar en faena. Lo primero que haremos es crearnos un proyecto ESB («File > New > Other»):

    Ponedle un nombre y pulsad Finish.

    Os creará el proyecto:

    Tendremos un proyecto vacío y únicamente nos crear el fichero descriptor jboss-esb.xml «vacío» (sólo contiene los namespaces)
    Vamos ahora a crear nuestro primer Servicio en JBossESB.
    Primero necesitamos una clase de «Action» (nos lo vamos a poner fácil por ser la primera vez):

    package com.autentia.tutoriales.jbossesb.actions;
    
    import org.jboss.soa.esb.actions.AbstractActionLifecycle;
    import org.jboss.soa.esb.helpers.ConfigTree;
    import org.jboss.soa.esb.message.Message;
    
    public class HelloWorldAction extends AbstractActionLifecycle {
    
    	protected ConfigTree config;
    
    	public HelloWorldAction(ConfigTree config) {
    		this.config = config;
    	}
    
    	public Message printBody(Message message) throws Exception {
    		System.out.println("**************************");
    		System.out.println(message.getBody().get());
    		System.out.println("**************************");
    		return message;
    	}
    
    }
    

    Una vez creada la acción, vamos a configurar el descriptor jboss-esb.xml:

    <?xml version="1.0"?>
    <jbossesb parameterReloadSecs="5"
     xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.3.0.xsd"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.3.0.xsd http://anonsvn.jboss.org/repos/labs/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.3.0.xsd">
     <providers>
      <jms-provider connection-factory="ConnectionFactory" name="JBossMQ">
       <jms-bus busid="easyServiceGatewayBus">
        <jms-message-filter dest-name="queue/easyServiceGateway"
    	dest-type="QUEUE" />
       </jms-bus>
       <jms-bus busid="easyServiceEsbAwareBus">
        <jms-message-filter dest-name="queue/easyServiceEsbAware" dest-type="QUEUE"/>
       </jms-bus>
      </jms-provider>
     </providers>
     <services>
      <service category="Tutoriales"
       description="Servicio sencillo para hacer pruebas" name="EasyFirstService">
       <listeners>
        <jms-listener busidref="easyServiceGatewayBus" is-gateway="true" name="easyServiceGatewayListener"/>
        <jms-listener busidref="easyServiceEsbAwareBus" name="easyServiceEsbAwareBusListener"/>
       </listeners>
       <actions mep="OneWay">
        <action
         class="com.autentia.tutoriales.jbossesb.actions.HelloWorldAction"
         name="PrintBodyAction" process="printBody"/>
       </actions>
      </service>
     </services>
    </jbossesb>

    Nuestro servicio «EasyFirstService», escuchará en los listeners: «easyServiceGatewayListener» y en «easyServiceEsbAwareBusListener». El primero de ellos («easyServiceGatewayListener») es un simple adaptador que convierte el mensaje de «No EsbAware» a «EsbAware».
    Actualmente sólo se realiza una acción («PrintBodyAction»).
    Ambos listeners están escuchando en colas JMS de JBossMQ.

    Una vez configurado el servicio, necesitamos crear el fichero «deployment.xml» (en el mismo lugar donde se encuentra «jboss-esb.xml»):

    <?xml version="1.0"?>
    <jbossesb parameterReloadSecs="5"
     xmlns="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.3.0.xsd"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.3.0.xsd http://anonsvn.jboss.org/repos/labs/labs/jbossesb/trunk/product/etc/schemas/xml/jbossesb-1.3.0.xsd">
     <providers>
      <jms-provider connection-factory="ConnectionFactory" name="JBossMQ">
       <jms-bus busid="easyServiceGatewayBus">
        <jms-message-filter dest-name="queue/easyServiceGateway"
    	dest-type="QUEUE" />
       </jms-bus>
       <jms-bus busid="easyServiceEsbAwareBus">
        <jms-message-filter dest-name="queue/easyServiceEsbAware" dest-type="QUEUE"/>
       </jms-bus>
      </jms-provider>
     </providers>
     <services>
      <service category="Tutoriales"
       description="Servicio sencillo para hacer pruebas" name="EasyFirstService">
       <listeners>
        <jms-listener busidref="easyServiceGatewayBus" is-gateway="true" name="easyServiceGatewayListener"/>
        <jms-listener busidref="easyServiceEsbAwareBus" name="easyServiceEsbAwareBusListener"/>
       </listeners>
       <actions mep="OneWay">
        <action
         class="com.autentia.tutoriales.jbossesb.actions.HelloWorldAction"
         name="PrintBodyAction" process="printBody"/>
       </actions>
      </service>
     </services>
    </jbossesb>

    Hemos indicado que nuestro servicio depende del despliegue de dos colas JMS.

    Ahora necesitamos crear las colas (lo podríamos hacer en los ficheros adecuados de JBossAS), pero también es posible definirlas como parte de nuestro fichero «.esb». Nos creamos el fichero «jbm-queue-service.xml» en la raíz del directorio esbcontent:

    <?xml version="1.0" encoding="UTF-8"?>
    <server>
      <mbean code="org.jboss.jms.server.destination.QueueService"
        name="com.autentia.tutoriales.jbossesb.destination:service=Queue,name=easyServiceGateway"
        xmbean-dd="xmdesc/Queue-xmbean.xml">
    	<depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
    	<depends>jboss.messaging:service=PostOffice</depends>
      </mbean>
      <mbean code="org.jboss.jms.server.destination.QueueService"
        name="com.autentia.tutoriales.jbossesb.destination:service=Queue,name=easyServiceEsbAware"
        xmbean-dd="xmdesc/Queue-xmbean.xml">
        <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
    	<depends>jboss.messaging:service=PostOffice</depends>
      </mbean>
    </server>

    La estructura final de nuestro proyecto será:

    Ya sólo nos queda desplegarlo. Botón derecho sobre el servidor: Añadir el proyecto al servidor:

    Si el servidor está arrancado, lo desplegará.

    Ya únicamente nos queda probarlo. Para eso, tenemos que enviar algún mensaje. Nos crearemos una clase para ello:

    package com.autentia.tutoriales.jbossesb.client;
    
    import java.util.Properties;
    import javax.jms.JMSException;
    import javax.jms.ObjectMessage;
    import javax.jms.Queue;
    import javax.jms.QueueConnection;
    import javax.jms.QueueConnectionFactory;
    import javax.jms.QueueSender;
    import javax.jms.QueueSession;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    
    
    
    public class SendingMessageClient {
    	
    	 	private Queue queue;
    	    private QueueSession queueSession;
    	    private QueueConnection queueConnection;
    
    	    public void startConnections() throws JMSException, NamingException {
    	        Properties props = new Properties();
    	        props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
    	        props.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
    	        props.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099");
    	        InitialContext initialContext = new InitialContext(props);
    	        
    	        QueueConnectionFactory factory = (QueueConnectionFactory) initialContext.lookup("ConnectionFactory");
    	        queueConnection = factory.createQueueConnection();
    	        queue = (Queue) initialContext.lookup("queue/easyServiceGateway");
    	        queueSession = queueConnection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
    	        queueConnection.start();
    	    }
    
    	    public void stopConnections() throws JMSException { 
    	        queueConnection.stop();
    	        queueSession.close();
    	        queueConnection.close();
    	    }
    	    
    	    public void send(String msg) throws JMSException {
    	        QueueSender send = queueSession.createSender(queue);        
    	        ObjectMessage tm = queueSession.createObjectMessage(msg);
    	        send.send(tm);
    	        send.close();
    	    }
    
    	    public static void main(String args[]) throws Exception {
    	        SendingMessageClient client = new SendingMessageClient();
    	        client.startConnections();
    	        client.send("Hola JBossESB"); 
    	        client.stopConnections();
    	    }
    
    }
    

    Ejecutad la clase y comprobad la consola:

    Bueno, pues ya hemos conseguido desplegar y probar nuestro primer servicio en JBossESB. En próximos tutoriales probaremos otras características del mismo.

1 COMENTARIO

  1. El contenido del fichero «deployment.xml» es el siguiente:

    jboss.esb.quickstart.destination:service=Queue,name=easyServiceGateway
    jboss.esb.quickstart.destination:service=Queue,name=easyServiceEsbAware

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad