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 mensajes que ya se han procesado. Sin esto, el árbol de mensajes continuaría creciendo más y más hasta haber procesado todas las instancias de la estructura de la SaleList.
Si el árbol de mensajes 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 mensajes variable. Esta es una de las partes del árbol de mensajes que puede suprimirse. El árbol de mensajes 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.
El flujo de mensajes de mensajería grande realiza el siguiente proceso:
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:
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.
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>