jueves, 24 de septiembre de 2015

WSO2 IDE Developer Studio. Ejemplo de uso.

image

En esta entrada quiero como se dice por acá, “matar 2 pájaros de un tiro” así que aprovecho un ejemplo de los muchos que están definidos en el WSO2 ESB y explico como desarrollarlo usando el IDE de WSO2, el Developer Studio.

Para este caso en particular, usaré el ejemplo 751, que nos permite adentrarnos en como usar los templates para definir secuencias y usarlas en un servicio proxy que implementa el patrón Split/Aggregate. El ejemplo 751 se deriva del ejemplo 400 sin templates

La idea es muy sencilla, queremos enviar un mensaje que en su payload contiene varios elementos similares en cuanto a su estructura pero con diferente contenido. Por cada uno de estos elementos queremos iterar y hacer la invocación a un servicio, las respuestas a dichas peticiones deben ser recuperadas por el ESB y agregadas hasta obtener un mensaje que contenga todas las respuestas recibidas.

Un ejemplo de mensaje de entrada es el siguiente:
<?xml version='1.0' encoding='UTF-8'?>
   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
         <wsa:To>http://localhost:5555/services/SplitAggregateProxy</wsa:To>
         <wsa:MessageID>urn:uuid:a234aff3-c645-4bac-8557-4372e9363963</wsa:MessageID>
         <wsa:Action>urn:getQuote</wsa:Action>
      </soapenv:Header>
      <soapenv:Body>
         <m0:getQuote xmlns:m0="http://services.samples">
            <m0:request>
               <m0:symbol>IBM</m0:symbol>
            </m0:request>
            <m0:request>
               <m0:symbol>IBM</m0:symbol>
            </m0:request>
            <m0:request>
               <m0:symbol>IBM</m0:symbol>
            </m0:request>
            <m0:request>
               <m0:symbol>IBM</m0:symbol>
            </m0:request>
         </m0:getQuote>
      </soapenv:Body>
   </soapenv:Envelope>

Y el mensaje de salida debe tener una estructura como la siguiente:

<?xml version='1.0' encoding='UTF-8'?>
   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soapenv:Body>
         <ns:getQuoteResponse xmlns:ns="http://services.samples">
            <ns:return xmlns:ax21="http://services.samples/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax21:GetQuoteResponse">
               <ax21:change>4.012088542808684</ax21:change>
               <ax21:earnings>13.46795609831801</ax21:earnings>
               <ax21:high>-178.2453541108561</ax21:high>
               <ax21:last>181.0176201634284</ax21:last>
               <ax21:lastTradeTimestamp>Tue Sep 22 22:57:00 EDT 2015</ax21:lastTradeTimestamp>
               <ax21:low>-179.93913725956736</ax21:low>
               <ax21:marketCap>-8620998.350687156</ax21:marketCap>
               <ax21:name>IBM Company</ax21:name>
               <ax21:open>-176.56347085172354</ax21:open>
               <ax21:peRatio>-17.917903631277916</ax21:peRatio>
               <ax21:percentageChange>-2.2808226783817926</ax21:percentageChange>
               <ax21:prevClose>-175.90532490036432</ax21:prevClose>
               <ax21:symbol>IBM</ax21:symbol>
               <ax21:volume>7194</ax21:volume>
            </ns:return>
         </ns:getQuoteResponse>
         <ns:getQuoteResponse xmlns:ns="http://services.samples">
            <ns:return xmlns:ax21="http://services.samples/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax21:GetQuoteResponse">
               <ax21:change>-2.450131414478575</ax21:change>
               <ax21:earnings>12.077240152328338</ax21:earnings>
               <ax21:high>189.43591761923946</ax21:high>
               <ax21:last>184.23135540409237</ax21:last>
               <ax21:lastTradeTimestamp>Tue Sep 22 22:57:00 EDT 2015</ax21:lastTradeTimestamp>
               <ax21:low>190.25599396746426</ax21:low>
               <ax21:marketCap>-4659673.483194811</ax21:marketCap>
               <ax21:name>IBM Company</ax21:name>
               <ax21:open>189.4323001114281</ax21:open>
               <ax21:peRatio>-19.076556985138353</ax21:peRatio>
               <ax21:percentageChange>1.3385382641199597</ax21:percentageChange>
               <ax21:prevClose>-183.04530248819202</ax21:prevClose>
               <ax21:symbol>IBM</ax21:symbol>
               <ax21:volume>17825</ax21:volume>
            </ns:return>
         </ns:getQuoteResponse>
         <ns:getQuoteResponse xmlns:ns="http://services.samples">
            <ns:return xmlns:ax21="http://services.samples/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax21:GetQuoteResponse">
               <ax21:change>-2.7759188649691673</ax21:change>
               <ax21:earnings>-8.64434464779646</ax21:earnings>
               <ax21:high>-155.45059265458414</ax21:high>
               <ax21:last>159.0026910255047</ax21:last>
               <ax21:lastTradeTimestamp>Tue Sep 22 22:57:00 EDT 2015</ax21:lastTradeTimestamp>
               <ax21:low>-158.61618247180033</ax21:low>
               <ax21:marketCap>4.113991018136966E7</ax21:marketCap>
               <ax21:name>IBM Company</ax21:name>
               <ax21:open>-156.0220318241818</ax21:open>
               <ax21:peRatio>23.020000568172797</ax21:peRatio>
               <ax21:percentageChange>1.7496688693602924</ax21:percentageChange>
               <ax21:prevClose>-158.65395524720563</ax21:prevClose>
               <ax21:symbol>IBM</ax21:symbol>
               <ax21:volume>18187</ax21:volume>
            </ns:return>
         </ns:getQuoteResponse>
         <ns:getQuoteResponse x372mlns:ns="http://services.samples">
            <ns:return xmlns:ax21="http://services.samples/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax21:GetQuoteResponse">
               <ax21:change>-2.9541965411380096</ax21:change>
               <ax21:earnings>12.143751209259607</ax21:earnings>
               <ax21:high>69.9594258475836</ax21:high>
               <ax21:last>68.14101070190179</ax21:last>
               <ax21:lastTradeTimestamp>Tue Sep 22 22:57:00 EDT 2015</ax21:lastTradeTimestamp>
               <ax21:low>70.62760392392916</ax21:low>
               <ax21:marketCap>-303514.44638798386</ax21:marketCap>
               <ax21:name>IBM Company</ax21:name>
               <ax21:open>-67.33049800682211</ax21:open>
               <ax21:peRatio>24.510801203367894</ax21:peRatio>
               <ax21:percentageChange>4.591238624436207</ax21:percentageChange>
               <ax21:prevClose>-64.34421694866225</ax21:prevClose>
               <ax21:symbol>IBM</ax21:symbol>
               <ax21:volume>5049</ax21:volume>
            </ns:return>
         </ns:getQuoteResponse>
      </soapenv:Body>
   </soapenv:Envelope>


Veamos como se hace, manos a la obra!!!!


Paso 1: Crear el proyecto en el IDE.


Una vez iniciado el IDE, basado en Eclipse, debemos ir al Dashboard de WSO2.


image


En este dashboard veremos varias facilidades, la que nos interesa ahora es “ESB Config Project”


image


Damos clic y creamos un proyecto nuevo.


image


Definimos un nombre, en mi caso fue “ESB4.9.0SynapseConfig” y al dar clic en Finish tendremos lo siguiente:


image


Como pueden ver tenemos las estructuras para definir los principales artefactos del WSO2 ESB.


Paso 2: Inicio de la creación del proxy.


Guiándonos por el ejemplo procedemos a crear el proxy, al menos su cascaron.


Damos clic derecho encima de “proxy-service” y realizamos las acciones que aparecen en la siguiente imagen.


image


Llegaremos a la siguiente ventana donde definimos el nombre del proxy y el tipo, luego damos clie en Finish.


image


Llegado a este punto ya el proxy está creado en el IDE.


image


Como las secuencias de entrada y salida usan el mediador “call-template” dejaremos el proxy así por el momento y crearemos los template de las secuencias que usaremos.


Paso 3: Creación de las secuencias.


Para crear los template damos clic derecho en “templates” y realizamos las acciones que aparecen en la siguiente imagen.


image


Definimos un nombre, usando lo especificado en el ejemplo y llegamos a la siguiente configuración inicial para el template “aggr_func”


image


Los siguientes pasos involucran agregar los mediadores, para lo cual los invito a hacer uso de la Paleta de componentes que aparece en la imagen de arriba a la izquierda. Deben de tener algo como lo siguiente al terminar.


image

El XML de este template debe ser el siguiente
<template xmlns="http://ws.apache.org/ns/synapse" name="aggr_func">
        <parameter name="aggr_expr"/>
        <sequence>
            <log level="full"/>
            <aggregate>
                <completeCondition>
                    <messageCount min="-1" max="-1"/>
                </completeCondition>
                <onComplete expression="$func:aggr_expr">
                    <log level="full" />
                    <send/>
                </onComplete>
            </aggregate>
        </sequence>
    </template>


Ahora procedemos a crear el template de la secuencia encargada de realizar la iteración. Que nos debe quedar como sigue.


image


El XML de la misma será el siguiente

<template xmlns="http://ws.apache.org/ns/synapse" name="iter_func">
        <parameter name="iter_expr"/>
        <parameter name="attach_path"/>
        <sequence>
            <iterate  xmlns:m0="http://services.samples" preservePayload="true" attachPath="$func:attach_path" expression="$func:iter_expr">
                <target>
                    <sequence>
                        <send>
                            <endpoint>
                                <address uri="http://localhost:9000/services/SimpleStockQuoteService"/>
                            </endpoint>
                        </send>
                    </sequence>
                </target>
            </iterate>
        </sequence>
    </template>


Paso 4: Ajustes finales en el proxy.


Una vez creados los 2 templates ya podemos actualizar nuestro proxy, quedandonos de la siguiente manera.


image


Su XML es el siguiente:

<proxy name="SplitAggregateProxy">
        <target>
            <inSequence>
                <call-template target="iter_func">
                        <with-param xmlns:m0="http://services.samples" name="iter_expr" value="{{//m0:getQuote/m0:request}}"/>
    <with-param xmlns:m0="http://services.samples" name="attach_path" value="{{//m0:getQuote}}"/>
                </call-template>
            </inSequence>
            <outSequence>
                <call-template target="aggr_func">
                        <with-param xmlns:m0="http://services.samples" name="aggr_expr" value="{{//m0:getQuoteResponse}}"/>
                </call-template>
            </outSequence>
        </target>
    </proxy> 


Para probar el proxy debemos seguir las indicaciones descritas en el ejemplo. Pero antes se debe desplegar en el ESB.


Paso 5: Despliegue del servicio.


Debemos crear un nuevo proyecto del tipo “Composite Application Project” haciendo uso del Dashboard del Developer Studio.


image


Seleccionamos la opción “Composite Application Project”


image


Definimos un nombre, y seleccionamos la dependencia de nuestro proyecto del ESB.

Una vez creado este proyecto se nos muestra lo siguiente.


image


Esto nos indica que tanto el proxy como los 2 templates generados serán desplegados en un servidor con el rol de EnterpriseServiceBus.


Ahora procedemos a generar el fichero que contendrá dichos artefactos. Damos clic derecho en el proyecto de “Composite Application Project” y seleccionamos la opción “Export Composite Application Project”.


image 


En la imagen verán que definí la ruta donde se despliegan las aplicaciones de carbon en el ESB, de esta manera tan pronto guarde el proyecto ahí se desplegarán los artefactos si todo ha ido bien.

Damos clic en Next.


image


Esto se queda como está y damos clic en Finish.


Si nos vamos al ESB y listamos los servicios veremos el servicio recién desplegado.


image


Y también comprobamos los templates para las secuencias.


image


De esta manera logramos realizar el despliegue de nuestros artefactos generados en el IDE en el servidor del WSO2 ESB.


Paso 6: Prueba del servicio.

Para probar el servicio primero debemos generar el backend a utilizar. Así que nos vamos a la ubicación [ESB_HOME]\samples\axis2Server\src\SimpleStockQuoteService\, levantamos un terminal y corremos el comando ant.


image


Luego nos vamos a la ubicación [ESB_HOME]\samples\axis2Server y levantamos el servidor de axis2 con el comando: axis2server.bat si estás en Windows, axis2server.sh si estás en Linux.


Para comprobar que el servicio esté corriendo pueden ver su wsdl en la siguiente URL: http://localhost:9000/services/SimpleStockQuoteService?wsdl


Ahora para terminar procedemos a la invocación del proxy. Para esto nos vamos a la ubicación [ESB_HOME]\samples\axis2Client y ejecutamos el siguiente comando:


ant stockquote -Daddurl=http://localhost:8280/services/SplitAggregateProxy -Ditr=4


En este caso no verán mucho que sea de fácil entender, por ese motivo he levantado un TCPMON, y configurado en escucha el puerto 5555 redireccionando para el puerto 8281, que en mi caso es por donde está escuchando el WSO2 ESB, al sumarle 1 a todos los puertos.


ant stockquote -Daddurl=http://localhost:5555/services/SplitAggregateProxy -Ditr=4


image


De esta manera es más fácil visualizar tanto el request como el response. Otra variante es usar el SOAPUI creando el request y especificando el SOAPAction correspondiente “urn:getQuote”


Si algo no les funciona o tienen dudas sobre el trabajo con los mediadores en el IDE me pueden dejar su comentario.

0 comentarios:

Publicar un comentario