jueves, 7 de diciembre de 2017

WSO2 EI:Escribir y leer en el registro interno



Se puede dar un escenario muy común donde tenemos algunas propiedades guardadas en el registro interno del WSO2 EI o el WSO2 ESB, y necesitamos ser capaces de leer la información y además de escribirla o actualizarla. En esta entrada veremos como escribir y leer del registro en el WSO2 EI.

Digamos que el escenario es el siguiente:
Tenemos un fichero de configuración en XML donde guardamos direcciones IP y puertos a donde debemos enviar determinada información.
Su estructura puede ser la siguiente:

<ListaEP xmlns:ns1="http://ejemplos.softdevelop.org/consultarEP">
 <EP>
  <IP>192.168.1.1</IP>
  <Puerto>8080</Puerto>
 </EP>
 <EP>
  <IP>192.168.1.2</IP>
  <Puerto>8081</Puerto>
 </EP>
 <EP>
  <IP>192.168.1.3</IP>
  <Puerto>8082</Puerto>
 </EP>
</ListaEP>

Se necesita:
  1. Un proxy que escriba el XML anterior en el registro interno. Aquí no veremos de donde viene la información, así que usaremos un payloadfactory para crear la estructura, pero el xml puede venir de la invocación de un servicio de datos o de cualquier otra fuente de información.
  2. Un proxy que lea el XML almacenado en el registro y pueda consultar las IP y los puertos.
En el WSO2 EI tenemos la estructura inicial creada en el registro:
image


Así que necesitamos primero el proxy para que escriba en ella. Este proxy se muestra a continuación:


<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="EscribirXMLPS"
       transports="https http"
       startOnLoad="true"
       statistics="enable"
       trace="enable">
   <description/>
   <target>
      <inSequence>
         <payloadFactory media-type="xml">
            <format>
               <ListaEP xmlns="http://ejemplos.softdevelop.org/consultarEP">
                  <EP>
                     <IP>192.168.4.1</IP>
                     <Puerto>8080</Puerto>
                  </EP>
                  <EP>
                     <IP>192.168.4.2</IP>
                     <Puerto>8081</Puerto>
                  </EP>
                  <EP>
                     <IP>192.168.4.3</IP>
                     <Puerto>8082</Puerto>
                  </EP>
               </ListaEP>
            </format>
            <args/>
         </payloadFactory>
         <property name="bodyEntradaESB"
                   expression="$env/*[local-name()='Body']"
                   scope="default"
                   type="OM"/>
         <property xmlns:ns1="http://ejemplos.softdevelop.org/consultarEP"
                   name="dataValida"
                   expression="$ctx:bodyEntradaESB/ns1:ListaEP"
                   scope="default"
                   type="STRING"/>
         <log level="custom">
            <property name="IMPRIMIR" value="Mensaje a guardar"/>
            <property name="BODY" expression="$ctx:bodyEntradaESB"/>
           <property name="Data" expression="$ctx:dataValida"/>
         </log>
         <script language="js">
importPackage(Packages.org.apache.synapse.config);
mc.getConfiguration().getRegistry().newResource("gov:/endpoints/ListaEP.xml",false);
mc.getConfiguration().getRegistry().updateResource(
  "gov:/endpoints/ListaEP.xml", mc.getProperty("dataValida").toString());
</script>
         <respond/>
      </inSequence>
   </target>
</proxy>

Al ejecutar el servicio proxy vemos la respuesta usando el Try it.
image


Y en el registro vemos que se ha creado el fichero con el XML.
image


Y su contenido es:
image


Ahora si queremos leer dicho XML usaremos el siguiente proxy:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="ConsultarXMLPS"
       transports="https http"
       startOnLoad="true"
       statistics="enable"
       trace="enable">
   <description/>
   <target>
      <inSequence>
         <property name="ListadoEP"
                   expression="get-property('registry','gov:/endpoints/ListaEP.xml')"
                   scope="default"
                   type="OM"/>
         <log level="custom">
            <property name="Registro:=====" expression="$ctx:ListadoEP"/>
         </log>
         <foreach xmlns:nm="http://ejemplos.softdevelop.org/consultarEP"
                  id="FE1"
                  expression="$ctx:ListadoEP//nm:EP">
            <sequence>
               <log level="custom">
                <property name="Registro" value="Accediendo a un registro"/>
                <property name="IP:" expression="//nm:EP/nm:IP"/>
                <property name="Puerto:" expression="//nm:EP/nm:Puerto"/>
               </log>
            </sequence>
         </foreach>
         <respond/>
      </inSequence>
   </target>
</proxy>

Al probar este proxy nos responde con un success pero nada más, pues no le inyectamos una respuesta que devolver. Pero si podemos ver en la consola como se accede a la información del XML.

image

Y ya con estos 2 proxy tenemos la funcionalidad deseada.
Espero les sea de utilidad.

0 comentarios:

Publicar un comentario