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.
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.
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.
<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>
//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();
}
<Record>
<Field1>A</Field1>
<Field2>B</Field2>
<Field3>C</Field3>
<Field4>D</Field4>
<Field5>E</Field5>
</Record>