Acerca del ejemplo de Mensajería grande

El ejemplo de mensajería grande es una aplicación de ejemplo de flujo de mensajes que se basa en un caso en el que, al final del día, se procesan los datos de las ventas.  Los mensajes que registran los detalles de las ventas a lo largo del día se agrupan en un lote en la tienda para transmitirlos al centro IT.  Cuando se reciben el en centro IT, vuelven a dividirse en las partes constituyentes del lote para procesarlas posteriormente. Esta división se lleva a cabo utilizando un flujo de mensajes de WebSphere Message Broker. Cada mensaje individual representa una venta y tiene la misma estructura.

Para la operación resulte más sencilla, los mensajes de entrada y de salida de este ejemplo se implementan como mensajes XML autodefinidos.  También podrían utilizarse fácilmente otros formatos de mensajes.

Cada mensaje de entrada consta de tres partes:

La estructura de SaleList es compleja.  Contiene:

La finalidad del proceso de este ejemplo es grabar cada una de las instancias de la estructura de SaleList como un mensaje individual de WebSphere MQ mientras se minimizan los requisitos globales de la memoria. La utilización de memoria virtual se minimiza suprimiendo las partes del árbol de mensaje que ya se han procesado.  Sin esto, el árbol de mensaje continuaría creciendo más y más hasta haber procesado todas las instancias de la estructura de la SaleList.  

Si el árbol de mensaje siguiese creciendo sin ningún servicio de limpieza, se podría llegar a tener requisitos de memoria virtual muy grandes para el grupo de ejecución que   está ejecutando el flujo de mensajes.  Esto puede convertirse en un problema significativo de rendimiento para los mensajes de entrada que tengan varios megabytes y puede requerir varios cientos de megabytes e incluso de gigabytes de memoria virtual dependiendo del tamaño del mensaje de entrada.

La técnica para el ahorro de memoria utilizada en el ejemplo requiere la utilización de un árbol de mensaje variable. Esta es una de las partes del árbol de mensaje que puede suprimirse.  El árbol de mensaje para InputRoot es invariable y, por lo tanto, no pueden suprimirse artículos del árbol según las necesidades.  En consecuencia, se crea otro árbol dentro del flujo de mensajes. Se establece usando una variable ROW de ESQL  y una llamada de función CREATE de ESQL. 

El proceso del ejemplo consta de un flujo de mensajes. El proceso que realiza se describe abajo.

Flujo de mensajes de mensajería grande

El flujo de mensajes de mensajería grande realiza el siguiente proceso:

  1. Lee un mensaje WebSphere MQ que contiene una carga útil XML bajo control transaccional.
  2. Da formato a un mensaje WebSphere MQ para cada instancia de la estructura de la SaleList.
  3. Graba los mensajes WebSphere MQ en la cola de salida.
  4. Produce un mensaje WebSphere MQ para indicar la finalización del proceso, cuando se ha procesado el último elemento

El flujo de mensajes de mensajería grande consta de los siguientes nodos:

El nodo MQInput MessageWithRepeatingElements lee el mensaje de WebSphere MQ que tiene una carga útil XML. Como el mensaje entrante tiene un formato XML autodefinido, no es necesario especificar ningún conjunto de mensajes o formato para que se analice correctamente.

El nodo Compute ProduceMessageSlicesFromRepeatingElements contiene la mayor parte del proceso correspondiente al flujo de mensajes.  Realiza el siguiente proceso:

  1. Crea un árbol variable que se convertirá en una copia de InputRoot.XML (el árbol de mensaje de InputRoot no es variable).  Esto se hace para reducir los requisitos globales de memoria del flujo de mensajes
  2. Crea un analizador XML para el nuevo árbol de mensaje.
  3. Copia InputRoot.XML en el nuevo árbol de mensaje.
  4. Obtiene el valor del campo SaleListCount que se encuentra en la cabecera del mensaje de entrada.  Dicho valor especifica cuántos artículos de repetición de SaleList se encuentran dentro del mensaje.  Esto se comprueba con el número procesado.
  5. Da formato a un mensaje WebSphere MQ para cada instancia de la estructura de la SaleList. 
  6. Envía el mensaje formateado junto con el resto del flujo de mensajes de forma que pueda grabarse como un mensaje de WebSphere MQ.  Esto se lleva a cabo utilizando el verbo PROPAGATE.
  7. Formatea y graba un mensaje de WebSphere MQ para indicar la confirmación del proceso del mensaje SaleEnvelope.

El nodo Filter IdentifyWhenSlicingIsComplete aplica una expresión de filtro al mensaje que se propagó en el nodo ProduceMessageSlicesFromRepeatingElements.  La finalidad de la prueba es determinar si el mensaje que entra en el nodo es el que ha de grabarse en la cola de mensajes procesados de SaleList o el mensaje de confirmación del lote.  Si es un mensaje que contiene un elemento de SaleList, el proceso pasa al nodo MQOutput RepeatedElementSlices que grabará el mensaje en una cola de WebSphere MQ. Si el mensaje recibido en el filtro IdentifyWhenSlicingIsComplete es la confirmación del lote, se grabará en como mensaje de WebSphere MQ en una cola distinta de la de los artículos de SaleList utilizando el nodo MQOutput MessageSlicingComplete.

En el flujo de mensajes hay más nodos que proporcionan proceso para distintas condiciones de error. El nodo MQOutput General Failure está conectado al terminal de anomalías del nodo MQOutput  El nodo graba el mensaje en la cola nombrada en el nodo MQOutput si se produce un error en el proceso dentro del nodo MQInput. El nodo de captación del nodo MQInput está conectado a un nodo de filtro llamado CatchProcessing.  Si se genera una excepción más adelante en el flujo de mensajes y es captada por este nodo, se propagará un mensaje a lo largo de esta ruta.  La expresión de filtro que hay dentro de CatchProcessing determina si el mensaje que se está procesando tiene el formato adecuado.  Si no lo tiene, el proceso para al nodo Throw Error desde donde se genera un error.  Si, el mensaje tiene algún error en el formato, por ejemplo si el último campo no se llama SlicingReport, el proceso pasa al nodo MQOutput Malformed Messages donde se graba en una cola de errores.

Mensaje de prueba

El mensaje de prueba que se utiliza para dirigir el ejemplo de direccionamiento de mensajes es un mensaje XML autodefinido que contiene detalles de facturación para un cliente.  Se puede ampliar el tamaño del mensaje repitiendo el artículo de SaleList.  El mensaje del ejemplo contiene diez repeticiones del artículo SaleList.  El diseño del mensaje puede verse a continuación.  En este caso se muestra únicamente una instancia de SaleList.

<SaleEnvelope>
<Header>
<SaleListCount>1</SaleListCount>
</Header>
<SaleList>
<Invoice>
<Initial>K</Initial>
<Initial>A</Initial>
<Surname>Braithwaite</Surname>
<Item>
<Code>00</Code>
<Code>01</Code>
<Code>02</Code>
<Description>Twister</Description>
<Category>Games</Category>
<Price>00.30</Price>
<Quantity>01</Quantity>
</Item>
<Item>
<Code>02</Code>
<Code>03</Code>
<Code>01</Code>
<Description>The Times Newspaper</Description>
<Category>Books and Media</Category>
<Price>00.20</Price>
<Quantity>01</Quantity>
</Item>
<Balance>00.50</Balance>
<Currency>Sterling</Currency>
</Invoice>
<Invoice>
<Initial>T</Initial>
<Initial>J</Initial>
<Surname>Dunnwin</Surname>
<Item>
<Code>04</Code>
<Code>05</Code>
<Code>01</Code>
<Description>The Origin of Species</Description>
<Category>Books and Media</Category>
<Price>22.34</Price>
<Quantity>02</Quantity>
</Item>
<Item>
<Code>06</Code>
<Code>07</Code>
<Code>01</Code>
<Description>Microscope</Description>
<Category>Miscellaneous</Category>
<Price>36.20</Price>
<Quantity>01</Quantity>
</Item>
<Balance>81.84</Balance>
<Currency>Euros</Currency>
</Invoice>
</SaleList>
<Trailer>
<CompletionTime>12.00.00</CompletionTime>
</Trailer>
</SaleEnvelope>

Icono de la página principal   Volver a la Página de presentación de ejemplos