Tenemos un WS que tienen tres operaciones insertar, consultar(query) y actualizar. Cuando damos de alta, no devuelve todos los datos que quisieramos. Muchos de estos datos se encuentran en la consulta. Lo que vamos a hacer, es, en un mismo proxy, realizar dos llamadas: insertar y consultar. Elmensaje de salida sera un compendio de las dos acciones.
1.- Consumidor del BUS de WSO2 realiza una llamada de inserccion.
2.- El proxy realiza la llamada de inserccion, recupera el xml resultante.
3.- El proxy recupera datos del xml resultante.
4.- El proxy crea un nuevo xml de peticion de consulta.
5.- El proxy lanza la consulta y recupera el xml de respuesta.
6.- El proxy recupera datos del xml de respuesta del apartado 5 y 3
7.- El proxy crea y envia un xml de respuesta para la llamada 1.
para todo esto necesitamos dar de alta:
– Endpoint
– Secuencias
– Proxy
Definicion del Endpoint
<endpoint xmlns="http://ws.apache.org/ns/synapse" name="pepe.crud"> <address uri="http://host:port/pepe/crudws" format="soap11"> <suspendOnFailure> <progressionFactor>1.0</progressionFactor> </suspendOnFailure> <markForSuspension> <retriesBeforeSuspension>0</retriesBeforeSuspension> <retryDelay>0</retryDelay> </markForSuspension> </address> </endpoint>
Definicion del proxy
<?xml version="1.0" encoding="UTF-8"?> <proxy xmlns="http://ws.apache.org/ns/synapse" name="pepe.crud.proxy" transports="https,http" statistics="disable" trace="disable" startOnLoad="true"> <target faultSequence="fault" endpoint="pepe.crud"> <!-- definimos una secuendcia de entrada. Aqui vamos a indicar que queremos hacer --> <inSequence> <!-- Recuperamos el tipo de operacion que se esta ejecutando. Pueden ser: insertRegisty, updateRegistry, queryRegistry --> <property name="Operation" expression="get-property('Action')"/> <!-- filtramos por el resultado de la operacion. Si es igual al patron regex=".*newRegistry" --> <filter source="get-property('Operation')" regex=".*newRegistry"> <then> <!-- incvocamos la secuencia añadir --> <sequence key="crud.addRegistry.sequence"/> </then> <else> <!-- Sino es la operacion de añadir, continuamos por aqui --> <send> <!-- enviamos al WebService la peticion--> <endpoint key="wspepe.crud"/> </send> </else> </filter> </inSequence> <!-- Tratamos la respuesta del servidor --> <outSequence> <filter source="get-property('Operation')" regex=".*newRegistry"> <then> <!-- Si era una operacion de insercion en registro. Realizamos la siguiente secuencia de operaciones. --> <sequence key="crud.outRegistry.sequence"/> </then> <else> <!-- Sino, logeamos --> <log level="full"> <property name="Operation" expression="get-property('Operation')"/> </log> </else> </filter> <!-- enviamos el mensaje a nuestro consumidor --> <send buildmessage="true"/> </outSequence> </target> <publishWSDL key="conf:/WSDL/crud.crudws/crudWS.wsdl"> <resource location="typeapplicant.xsd" key="conf:/WSDL/crud.crudws/typeapplicant.xsd"/> <resource location="typeattachment.xsd" key="conf:/WSDL/crud.crudws/typeattachment.xsd"/> <resource location="typecommon.xsd" key="conf:/WSDL/crud.crudws/typecommon.xsd"/> <resource location="typecrud.xsd" key="conf:/WSDL/crud.crudws/typecrud.xsd"/> </publishWSDL> <description/> </proxy>
Definicion de las secuencias
<sequence xmlns="http://ws.apache.org/ns/synapse" name="crud.addRegistry.sequence"> <!-- logeamos --> <log level="full"> <property name="SEQ" value="Accediendo a la secuencia ADD"/> </log> <!-- invocamos a otro endpoint --> <send receive="crud.queryRegistry.sequence" buildmessage="true"> <endpoint key="pepe.crudws"/> </send> </sequence>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="crud.outRegistry.sequence"> <log level="full"> <property name="SEQ" value="Accediendo a la secuencia OUT"/> <property xmlns:ns="http://org.apache.synapse/xsd" name="RegistryCode" expression="get-property('RegistryCode')"/> <property xmlns:ns="http://org.apache.synapse/xsd" name="IdRegistry" expression="get-property('IdRegistry')"/> </log> </sequence>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="crud.queryRegistry.sequence"> <!-- Obtenemos los datos del alta del nuevo registro para poder realizar la consulta --> <property name="IdRegistry" expression="$body/ns6:RIResponse/body/idcrud" xmlns:ns2="http://ws.pepe.com/types/attachment" xmlns:ns4="http://ws.pepe.com/types/common" xmlns:ns="http://org.apache.synapse/xsd" xmlns:ns5="http://ws.pepe.com/types/crud" xmlns:ns6="http://ws.pepe.com/crudws" /> <property name="RegistryCode" expression="$body/ns6:RIResponse/body/crudcode" xmlns:ns2="http://ws.pepe.com/types/attachment" xmlns:ns4="http://ws.pepe.com/types/common" xmlns:ns="http://org.apache.synapse/xsd" xmlns:ns5="http://ws.pepe.com/types/crud" xmlns:ns6="http://ws.pepe.com/crudws" /> <log level="full"> <property name="SEQ" value="Accediendo a la secuencia QUERY 1"/> <property name="RegistryCode" expression="get-property('RegistryCode')" xmlns:ns="http://org.apache.synapse/xsd" /> <property name="IdRegistry" expression="get-property('IdRegistry')" xmlns:ns="http://org.apache.synapse/xsd" /> </log> <!-- creamos un xml a medida para enviar al endpoint --> <payloadFactory media-type="xml"> <format> <reg:RQRequest xmlns:reg="http://ws.pepe.com/crudws" xmlns:reg1="http://ws.pepe.com/types/crud"> <header xmlns="" version="0"/> <body xmlns=""> <crudcode>$1</crudcode> <input>1</input> </body> </reg:RQRequest> </format> <args> <arg xmlns:ns="http://org.apache.synapse/xsd" expression="get-property('RegistryCode')" evaluator="xml"/> </args> </payloadFactory> <!-- enviamos el xml creado al endpoint --> <header name="Action" value="http://ws.pepe.com/crudws/queryRegistry"/> <send> <endpoint key="pepe.crudws"/> </send> <log level="full"> <property name="SEQ" value="Accediendo a la secuencia QUERY 2"/> </log> </sequence>
Este codigo ha sido elaborado por Rafael Udaondo. Con su permiso he publicado esta entrada.