WebSphere Message Broker, Versión 8.0.0.5 Sistemas operativos: AIX, HP-Itanium, Linux, Solaris, Windows, z/OS

Consulte la información sobre la última versión del producto en IBM Integration Bus, Versión 9.0

Trabajar con mensajes de entrada grandes para propagar varios mensajes de salida

La representación de árbol de un mensaje suele ser más grande que la corriente de bits de entrada. La manipulación de un árbol de mensaje grande puede requerir una gran cantidad de almacenamiento, pero puede codificar métodos Java™ que ayuden a reducir la carga de almacenamiento en el intermediario.

Cuando se analiza una corriente de bits de entrada y se crea un árbol lógico, la representación de árbol de un mensaje suele ser más grande, y en algunos casos mucho más grande, que la corriente de bits correspondiente.
Entre las razones de esta expansión se incluyen los factores siguientes:
  • La adición de punteros que enlazan los objetos entre sí
  • La conversión de datos de tipo carácter a Unicode, que puede duplicar el tamaño original
  • La inclusión de nombres de campo que pueden haber estado implícitos en la corriente de bits
  • La presencia de datos de control que están asociados al funcionamiento del intermediario

La manipulación de un árbol de mensaje grande puede requerir mucho almacenamiento. Si diseña un flujo de mensajes que maneja mensajes grandes que están formados por estructuras repetitivas, puede codificar métodos Java que ayuden a reducir la carga de almacenamiento en el intermediario. Estos métodos permiten acceder al mensaje de forma tanto aleatoria como secuencial, pero presuponen que no necesita acceder a todo el mensaje a la vez.

Estos métodos Java hacen que el intermediario realice un análisis limitado del mensaje, y mantenga en el almacenamiento a la vez, sólo la parte del árbol de mensajes que refleja un registro individual. Si el proceso requiere que retenga información registro a registro (por ejemplo, para calcular un precio total a partir de una estructura repetitiva de artículos en un pedido), puede declarar, inicializar y mantener variables Java, o puede guardar los valores en otra parte del árbol de mensaje; por ejemplo, en el entorno local.

Esta técnica reduce la memoria que el intermediario utiliza a la memoria necesaria para contener las corrientes de bits de entrada y salida completas, más la memoria que es necesaria para los árboles de mensajes de un solo registro. Esta técnica también proporciona un ahorro de memoria incluso cuando se encuentra un pequeño número de repeticiones en el mensaje. El intermediario utiliza el análisis parcial y la posibilidad de analizar partes específicas del árbol de mensaje, a y desde la parte correspondiente de la corriente de bits.

Para utilizar estas técnicas en el nodo JavaCompute (o el nodo Java definido por el usuario), realice cualquiera de los pasos siguientes.
  • Copie el objeto MbMessage de entrada utilizando el constructor de copia. Esta acción crea una copia modificable del mensaje de entrada que no se analiza y que, por consiguiente, utiliza una cantidad mínima de memoria.
  • Evite inspeccionar el mensaje de entrada, lo que evita la necesidad de analizar el mensaje.
  • Utilice un bucle y una variable MbElement para recorrer el mensaje registro a registro. Para cada registro, utilice los procesos siguientes:
    • Utilice transformaciones normales para construir un subárbol de salida correspondiente en un MbMessage de salida.
    • Utilice el método MbElement.delete() para suprimir el árbol de mensaje del registro de entrada actual cuando haya completado la manipulación del registro.
    • Utilice el código siguiente para propagar el mensaje de salida para el registro actual.
      MbOutputTerminal.propagate(MbMessageAssembly, true)
      Este proceso permite recuperar y reutilizar recursos de árbol de mensaje y analizadores para la siguiente iteración del mensaje de salida.

Puede modificar estas técnicas para adaptarlas al proceso necesario para los mensajes.

El siguiente ejemplo de código Java muestra cómo analizar un mensaje de entrada grande con muchos registros repetitivos, donde cada registro se propaga como un mensaje de salida individual.

Los mensajes XMLNSC de entrada están el formato siguiente, donde hay muchos elementos Record repetitivos.
<TestCase>
  <Record><Field1>A</Field1><Field2>B</Field2><Field3>C</Field3><Field4>D</Field4><Field5>EA</Field5></Record>
  <Record><Field1>A</Field1><Field2>B</Field2><Field3>C</Field3><Field4>D</Field4><Field5>EA</Field5></Record>
  <Record><Field1>A</Field1><Field2>B</Field2><Field3>C</Field3><Field4>D</Field4><Field5>EA</Field5></Record>
  <Record><Field1>A</Field1><Field2>B</Field2><Field3>C</Field3><Field4>D</Field4><Field5>EA</Field5></Record>
  ....
</TestCase>
El ejemplo siguiente muestra el código Java que se puede utilizar para analizar este mensaje grande, registro por registro, y propagar cada registro.
//Crear un MbMessage modificable basado en el mensaje de entrada que se ha pasado en inAssembly.
MbMessage clonedInMessage = new MbMessage(inAssembly.getMessage());
//Ahora analizar parcialmente el mensaje de entrada clonado, registro por registro.
MbElement inputRootElement = clonedInMessage.getRootElement();
MbElement inputPropertiesElement = inputRootElement.getFirstElementByPath("Properties");
MbElement inputMQMDElement = inputRootElement.getFirstElementByPath("MQMD");
MbElement inputXMLNSCElement = inputRootElement.getFirstElementByPath("XMLNSC");

MbElement inputXMLNSCRootTagElement = inputXMLNSCElement.getFirstChild(); //Ir a la etiqueta TestCase
MbElement currentInputRecord = inputXMLNSCRootTagElement.getFirstChild(); //Ir a la etiqueta Record

while(currentInputRecord != null)
{
  // Crear un nuevo mensaje de salida para el registro que se va a propagar.
  MbMessage outputMessage = new MbMessage();
  MbMessageAssembly outAssembly = new MbMessageAssembly(inAssembly, outputMessage);

  //Crear nuevas carpetas de analizadores en el mensaje de salida.
  MbElement outputRootElement = outputMessage.getRootElement();
  MbElement outputPropertiesElement = outputRootElement.createElementAsLastChild(inputPropertiesElement.getParserClassName());
  MbElement outputMQMDElement = outputRootElement.createElementAsLastChild(inputMQMDElement.getParserClassName());
  MbElement outputXMLNSCElement = outputRootElement.createElementAsLastChild(inputXMLNSCElement.getParserClassName());       
  //Crear la etiqueta root en la carpeta XMLNSC de salida que se utilizará para este registro de salida.
  MbElement outputXMLNSCRootTag = outputXMLNSCElement.createElementAsLastChild(MbElement.TYPE_NAME, "TestCase", null);
  //Crear la etiqueta record para esta instancia de mensaje de salida.
  MbElement currentOutputRecord = outputXMLNSCRootTag.createElementAsLastChild(MbElement.TYPE_NAME, "Record", null);

  //Copiar la carpeta de Propiedades, la cabecera MQMD y el registro actual.
  outputPropertiesElement.copyElementTree(inputPropertiesElement);
  outputMQMDElement.copyElementTree(inputMQMDElement);
  currentOutputRecord.copyElementTree(currentInputRecord);   

  //Propagar este mensaje, solicitando que el conjunto de mensajes de salida se borre tras la propagación.
  out.propagate(outAssembly, true);
  //Nota: No es necesario que llame a clearMessage en outputMessage porque se ha borrado tras la propagación.

  //Tomar una referencia al registro actual para poder suprimirlo.
  MbElement previousInputRecord = currentInputRecord;
  //Ahora ir al siguiente registro de entrada que esté listo para ser procesado.
  currentInputRecord = currentInputRecord.getNextSibling();
  //Ahora que ya hemos ido al siguiente hermano, suprimir el registro de entrada que ya se ha procesado.
  previousInputRecord.delete();

}
Este código Java genera un mensaje para cada subárbol Record repetitivo en el mensaje XMLNSC de entrada:
<Record>
  <Field1>A</Field1>
  <Field2>B</Field2>
  <Field3>C</Field3>
  <Field4>D</Field4>
  <Field5>E</Field5>
</Record>
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Comentarios

Copyright IBM Corporation 1999, 2014Copyright IBM Corporation 1999, 2014.

        
        Última actualización:
        
        Última actualización: 2015-02-28 17:00:53


Tema de tareaTema de tarea | Versión 8.0.0.5 | bc23802_