Archivos Mensuales: julio 2007

Proyecto Mini ESB DotNet Código Abierto, Mensaje Universal

Dentro de los diferentes aspectos que hemos estado discutiendo en el contexto de este proyecto (Crear un ESB) estamos en este momento revisando el modelo de mensaje universal [1].

La idea es tener un único esquema de mensajería con el ESB simplificando de esa manera enormemente el problema.

 

Mensaje Universal

Las aplicaciones para comunicarse con la plataforma de integración utilizan mensajes XML. Un mensaje no contiene sólo información de los argumentos a utilizar en la llamada a la operación del servicio de negocio. Además de esta información propia del negocio contiene mucha información de utilidad para la plataforma.

La información propia de la plataforma son datos que se trasmiten fuera de banda. La idea es que no se mezclen con los datos de negocio.

Para simplificar la modelo y que la integración con la plataforma de integración se define usar un mensaje canónico de comunicación. Fowler llama a este mensaje universal como Canonical Data Model. La siguente figura muestra el patrón de Fowler.

Figura 1: Patrón Canonical Data Model.

La idea es que todas las aplicaciones y servicios usan un esquema de mensaje único. Está definición facilita el trabajo para los desarrolladores de servicios y aplicaciones porque siempre deben usar el mismo esquema.

Este mensaje para poder ser útil para todos los servicios debe ser capaz de contener los datos fuera de banda (para la plataforma) y los datos de negocio (para el servicio). Esto se logra implementando el patrón Envelope Wrapper, que se muestra en la siguiente figura.

Los datos de negocio, son insertados en el mensaje. Este mensaje viaja por la plataforma y al momento de consumir el Servicio de Negocio los datos de negocio son extraídos y pasados al servicio. La respuesta del servicio sigue el mismo proceso pero hacia la aplicación, que cuando recibe la respuesta la extrae del mensaje.

Figura 2: Patrón WRAPPER

 

Esquema de Mensaje propuesto

Para la plataforma de integración se propone el uso de un esquema de mensaje que tiene tres grandes secciones:

 

  • HEADER
  • BODY
  • ERROR

El esquema con estas tres secciones se muestra en la siguiente figura.

Figura 3: Esquema mensaje universal.

 
HEADER

La sección HEADER tiene como objetivo contener los datos de contexto necesarios para que la plataforma pueda actuar. Son los datos fuera de banda. En la siguiente figura se muestra la información que contiene e HEADER.

Figura 4: HEADER mensaje universal.

Los campos de está sección son lo siguientes:

Ø HASH

    • Request: Es la firma de los argumentos de llamada.
    • Repsonse: Es la firma de la respuesta.

Ø Gestión: es un diccionario de campos para destacar información del mensaje que debe ser almacenada en el LOG para gestión de manera destacada.

Ø Expiración: da el tiempo de vida del mensaje. Se usa para procesos de larga duración.

Ø Secuenciador: es el atributo que permite ensamblar una respuesta que viene dividida en partes.

  • Secuencia: Identificador del mensaje dividido.
  • Posición: indica que parte del mensaje es.
  • Fin: indica si es la última parte del mensaje.

Ø CorrelationID: Es el identificador de correlación. Tiene como objetivo ser un identificador único de los mensajes. Como no es posible tener un generador de números únicos para todas las aplicaciones que se conectan a la plataforma de integración, esto es un identificador compuesto.

 

  • appOrigen: Identifica la aplicación que llama a la plataforma.
    • § idUsuario: Identifica al usuario de la aplicación.
    • § idRequest: identificador de transacción de la aplicación.
    • § timeStamp: Fecha y hora de la llamada.
    • § CanalRespuesta: Para respuestas asíncronas indica la URI del canal de respuesta.
  • serDestino: identifica al servicio que se está llamado. Esta es una identificación lógica, porque es el motor de integración quien cursará la llamada para el servicio finalmente.
    • § isServicio: identificador del servicio.
    • § URI: URI del servicio expuesto por la plataforma.
  • tipoRequest: identifica el esquema de mensaje que se está enviando.
  • Version: versión del mensaje que se está llamando.
BODY

En el BODY se encuentran los parámetros de la llamada a la operación de negocio y en respuesta, viene la respuesta del servicio.

En la figura 5 se muestra el esquema.

Los parámetros son opcionales y son una tabla hash de parámetros serializados en XML.

La respuesta es un TAG de XML sin esquema porque puede contener cualquier información.

 

Error

Aquí se almacena la información de excepciones que ocurren en el circuito de la llamada al servicio. Este es un TAG opcional.

Los campos de esta sección son los siguientes:

 

  • Ø idError: Identificador del error.
  • Ø dateTime: Fecha y hora del error.
  • Ø Origen: es la glosa del lugar dónde se produjo el error.
  • Ø Tipo: Es el tipo de error.
  • Ø Decripcion: Es la descripción del error.

Figura 4: BODY y ERROR del esquema XML

El siguiente código muestra el esquema XSD

 

<?xml version="1.0" encoding="utf-8"?>
<!– edited with XMLSpy v2006 rel. 3 sp1 (http://www.altova.com) by Juan Pablo (Datco) –>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="xml1">
        <xs:annotation>
            <xs:documentation>Raiz</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Header">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="correlationId">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="appOrigen">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="idAplicacion" type="xs:string" nillable="false" />
                                                    <xs:element name="idUsuario" />
                                                    <xs:element name="idRequest" />
                                                    <xs:element name="timestamp" />
                                                    <xs:element name="CanalRespuesta" />
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                        <xs:element name="serDestino">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="idServicio" type="xs:string" />
                                                    <xs:element name="uri" type="xs:anyURI" />
                                                    <xs:element name="Versión" />
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                        <xs:element name="tipoRequest" />
                                        <xs:element name="version" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="secuenciador">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="secuencia" type="xs:int" default="1" />
                                        <xs:element name="posicion" type="xs:int" default="0" />
                                        <xs:element name="fin" type="xs:boolean" default="true" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="expiracion" type="xs:dateTime" />
                            <xs:element name="gestion" minOccurs="0">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="campo" type="xs:string" maxOccurs="unbounded" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="hash" minOccurs="0">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="request" />
                                        <xs:element name="response" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="body">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="parametros" minOccurs="0">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="parametro" maxOccurs="unbounded">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="nombre" type="xs:string" />
                                                    <xs:element name="valor" />
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="respuesta">
                                <xs:complexType>
                                    <xs:attribute name="datetime" type="xs:string" use="required" />
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="error" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="idError" />
                            <xs:element name="datetime" />
                            <xs:element name="Orgien" />
                            <xs:element name="tipo" />
                            <xs:element name="Descripcion" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Código Esquema XSD del mensaje universal.

Referencias

[1] http://www.enterpriseintegrationpatterns.com/CanonicalDataModel.html

Anuncios

Proxy Dinámico en WCF

Para un proyecto de ESB un ingeniero de software me pregunta cómo hacer un Proxy dinámico en WCF. Entonces yo que soy muy estudioso le digo de inmediato “usemos MEX!!!”

Este Ingeniero me dice ok necesito un ejemplo. Yo le digo, tengo uno te lo mando….. Problema no encuentro el ejemplo así que voy y le pregunto a dios Google “WCF Dynamic Proxy” y me lleva a esta librería que encapsula toda la complejidad del intercambio del metadata y lo deja en una librería bien armada.

Les sugiero que vean este ejemplo, todas las flores para el autor.

Ejemplo de Proxy Dinámico

Salu2

Windows Live Writer, dejó de ser BEta

Por fin salio la versión final del editor de Post, para los que le gusta escribir en Blogs está muy bueno.

Yo lo estoy usando para escribir este POST.

Dentro de las funcionalidades nuevas que trae están:

  1. Poder dar una fecha de publicación.
  2. Manejo de Plugin como por ejemplo para copiar código desde Visual Studio formateado.
  3. Manejo de Glosario :O muy cool para quien postea puros acrónimos como ESB, WS, FIFO, LIFO, etc….
  4. Mejora en la inserción de link’s

Que lo disfruten, se puede descargar for free desde Aquí

salu2

Línea de Mando :)

EL  PRESIDENTE  DE  LA  COMPAÑIA  LE  DICE  A  SU  GERENTE GENERAL:
"El lunes próximo, a eso de las siete de la tarde el cometa Halley se hará
visible. Es un acontecimiento que ocurre cada 78 años. Reúna a todo el
personal en el patio de la fábrica, todos usando casco de seguridad, que allí les
explicaremos el fenómeno. Si llueve, este raro espectáculo no podrá ser
visto a ojo desnudo, en ese caso, entraremos al comedor donde será
exhibido un documental sobre ese mismo tema" .

EL GERENTE GENERAL AL JEFE  DE  PRODUCCIÓN:
"Por orden del presidente, el lunes a las siete aparecerá sobre la fábrica
el cometa Halley. Si llueve reúna a todos los empleados con casco de seguridad
y llévelos al comedor, donde tendrá lugar un raro espectáculo, que sucede cada
78 años a ojo desnudo ".

EL JEFE  DE  PRODUCCIÓN  AL  SUPERVISOR:
" A pedido de nuestro gerente general, el científico Halley, de 78 años,
aparecerá desnudo en el comedor de la fábrica usando casco, porque va a ser
presentado un documental sobre el problema de la seguridad en días de lluvia " .

EL SUPERVISOR A SU ASISTENTE:
"Todo el mundo desnudo sin excepción, deberá estar en el patio el lunes a
las siete, donde el famoso músico Halley mostrará el video "Bailando bajo la lluvia "
El show se presenta cada 78 años

POR ULTIMO…… EL ASISTENTE A SUS EMPLEADOS:
" El jefe cumple 78 años el lunes y habrá una fiesta en el patio y en el comedor

 con el famoso conjunto Bill Halley y sus cometas. Todo el que quiera puede ir en pelota,

pero usando casco,porque se va a armar un flor de hueveo, aunque llueva "

   

   

¿ Còmo serà cuando un cliente pide algo ?…………….

Notable carta, el otro Chile habla

Me llegó una copia de la carta que copio en este POST. Creo que refleja fielmente un problema cebero de estigmatización de la pobreza que hay en Chile porque para muchos chilenos ese es "otro Chile" el cual no conocen y no quieren invertir su tiempo en conocer ni entender pero si son los primeros en vociferar sus desinformados juicios.

Recuerdo una discusión con compañeros de la U, unos dos meses atrás, dónde uno de ellos proponía que la solución a todos estos problemas era encarcelar y matar a los delincuentes. Yo en mi pobre entendimiento no fui capaz de articular la idea de que "… el origen de la delincuencia es la pobreza y que en ningún país ha llegado la paz antes de la justicia social…" la que brillantemente expresa el remitente en esta carta.

————————————————————————————————————————

Srs.
Chilevisión
PRESENTE

Estimados Señores:

Somos pobladores de la Legua Emergencia, miembros de la comunidad Cristiana ‘Nuestra Señora de la Paz’, ubicada exactamente en el corazón de la Población a la que ustedes dedicaron el último programa
de la serie ‘En la Mira’. Mediante esta carta quisiéramos reflejarles las repercusiones que ha traído para nosotros la emisión del programa
‘El ghetto de la muerte’ transmitido el recién pasado lunes 18 de Junio.

En términos de rating el programa ha sido evaluado como un éxito.
¿Y en términos de responsabilidad social qué evaluación van a darle ustedes?
¿Se han preguntado qué repercusiones tiene para los que viven día a día en ese lugar las imágenes, las entrevistas y la edición que han hecho sobre nuestra población?
Para nosotros, pobladores de la Legua Emergencia, ha significado en la práctica un endurecimiento en el ya insoportable aislamiento que vivimos dentro de Santiago, como producto de la estigmatización que se ha instalado en la opinión pública.
Los resultados de esta estigmatización, que posiciona en el imaginario de los habitantes de nuestra ciudad que toda persona relacionada con la Legua es un posible drogadicto, traficante o
delincuente, son muy concretos y reales: ahora es aún más difícil conseguir empleo y más necesario ocultar domicilio, familia y raíces para obtener un puesto de trabajo.

Ahora hay menos voluntarios que quieran venir a trabajar en los programas sociales y se ha debilitado la red social que es en la práctica la única fuente de esperanza para los vecinos.
Ahora es más difícil que algún chofer quiera entrar a nuestra población.
La presunción de que todo legüino es narcotraficante o delincuente se confirma como un papel de antecedentes que nos acompaña desde la niñez hasta la muerte.

Ustedes han presentado en una hora y media los antecedentes de violencia acontecidos durante más de tres años en nuestras casas, calles y  pasajes.
No han mentido, simplemente han editado los datos.
Han mostrado escenas espectaculares y nos han presentado al país como un pedazo de Centro  América en el corazón de Chile.

Pero no somos otro país, somos tan Chile como  Ñuñoa o Vitacura.
El nuestro no es un problema de delincuencia, tampoco es el fracaso de un gobierno de turno.
Las balas que ustedes han mostrado son la Huella del fracaso de un proyecto de sociedad.
¿Asumirán la esponsabilidad de decir eso a la opinión pública?
¿Asumirán la responsabilidad de tratar ‘temas sociales’ interpelando al sector privado a crear una agenda prioritaria de empleo para los sectores más expuestos al flagelo de la cesantía que fomenta el narcotráfico entre los más pobres?
¿Asumirán las consecuencias denunciando la hipocresía del consumo de droga que es el mercado que provoca el narcotráfico, la violencia y la miseria de nuestras poblaciones?
¿Le dirán al país que no es sólo la Legua, sino muchas poblaciones las que se han ido transformando en ghettos por el clasismo ambiental?
¿Le dirán al país que el origen de la delincuencia es la pobreza y que en ningún país ha llegado la paz antes de la justicia social?
¿Mostrarán a la opinión las vidas dignas y valiosas, los profesionales, los universitarios, los proyectos de emprendimiento de la gran mayoría de los habitantes de nuestras poblaciones estigmatizadas?

Finalmente, ¿qué harán por la niña, participando en el ‘Vía Crucis’, cuyo rostro descubierto mostraron dando valientemente un testimonio mientras los policías ocultaban el suyo?
¿Qué harán por los niños de la Legua ?
¿Qué harán para que no aumente la deserción escolar que los expone a la droga?

Sabemos que ustedes tienen buena voluntad.
Por favor sumen a la buena intención la voluntad de ponerse en el lugar de aquellos para quienes la pobreza no es un espectáculo.
Pongan los problemas sociales en el corazón del sector privado no como un peligro a la seguridad sino como el síntoma de una sociedad que hay que re construir.

Atentamente

Comunidad Cristiana
Nuestra Señora de la Paz
Legua Emergencia

P.Gerardo Ouisse Comunidad Cristiana

Párroco de La Legua. ‘Nuestra Señora de la Paz’

Biztalk Server ¿Cómo filtrar en el mapper?

Para un proyecto de BizTalk Server 2006 tuvimos que usar el Mapper de manera intensa. Una de las cosas que aprendí implementando unas transformaciones algo que suena my trivial, y en rigor lo es pero cuando uno sabe cómo hacerlo.

La problemática es la siguiente:

Si quiero pasar de un esquema A a un esquema B, dónde el mensaje original tiene un Record con múltiples filas y el destino sólo requiere una fila debemos filtrar.

 ¿Cómo puedo filtrar usando el mapper?

La solucionatica.

Para esto se deben usar dos Functoids:

 

  • Equal: Use the Equal functoid to return the value “true” if the first input parameter is equal to the second input parameter. This functoid requires two input parameters.
  • Looping: Use the Looping functoid to combine multiple records and/or fields in the source schema into a single record in the destination schema. This functoid needs at least one input parameter. There is no limit to the number of input parameters that the Looping functoid will accept. Only links are allowable as input parameters.

La idea es que Looping realiza las iteraciones de todos los elementos contenidos el record. Equal se usa para generar una salida lógica (True/False). La salida de la condición lógica se junta con la salida del Looping. Si el valor de la comparación lógica es verdadero, entonces se copia el registro al destino. Si es falso el registro se ignora.

Está es una simple implementación de un filtro en el Mapper.

La siguiente imagen muestra el mapa de ejemplo.

¿Cómo cargar un Resulset Java desde un XML?

Para un proyecto de ESB en BizTalk inserto en un mundo de aplicaciones JAVA. La idea es que ahora las apliaciones Web utilicen servicios desde el ESB y no obtengan toda la información directamente desde la base de datos.

En ese contexto me hacen la siguiente pregunta:

"… Si usamos tu ESB en BizTalk ¿Qué pasa con nuestras aplicaciones? Nosotros usamos hasta ahora consultas directas a la DB y leemos el resultado de la consulta usando un objeto Resulset. ¿Cómo cargo el XML de respuesta que ahora me retornará el ESB en vez del Resulset de la db?…."

La idea aquí es intervenir la aplicación lo menos posible, por lo que si le damos al cliente una solución para cargar los Resultset desde un XML está resuelto el problema. Para felicidad de todos en la versión JDK 1.5 tenemos webrowset, que permite cargar desde un XML y tiene implementada la interfaz ResultSet. Usandolo este problema se soluciona.

El código es un ejemplo de esto que me prestó mi amigo Eduardo Díaz [1], master de Java. Pueden ver el código en este Link: Código.

Ahora para que todo cuadre perfecto, es necesario generar el XML en el esquema que el Webrowset entienda. Para eso hay que respetar el siguiente esquema. La definición del esquema pueden verla aquí.

Eso es Todo 😉 Enjoy.

Referencias

[1] Eduardo Díaz, eduardo@gici.cl , http://www.gici.cl/