A representação em árvore de uma mensagem XML normalmente é maior que o fluxo de bits de entrada. A manipulação de uma árvore de mensagens grande pode exigir muito armazenamento, mas é possível codificar instruções ESQL que ajudem a reduzir a carga do broker.
A manipulação de uma árvore de mensagens grande pode exigir muito armazenamento. Se você projetar um fluxo de mensagens que manipule mensagens grandes compostas de estruturas de repetição, poderá codificar instruções ESQL, que ajudam a reduzir a carga de armazenamento no intermediário. Essas instruções suportam o acesso aleatório e seqüencial à mensagem, mas supõem que você não necessite de acesso à mensagem completa de uma vez.
Essas instruções ESQL fazem com que o intermediário execute a análise limitada da mensagem e mantenha em armazenamento ao mesmo tempo somente a parte da árvore de mensagens que reflete um único registro. Se seu processamento exigir que você retenha informações de registro a registro (por exemplo, para calcular o preço total de uma estrutura de repetição de itens em uma ordem), é possível declarar, inicializar e manter variáveis ESQL ou salvar valores em outra parte da árvore de mensagens; por exemplo, no ambiente local.
Essa técnica reduz a memória que é utilizada pelo broker para a memória necessária para manter os fluxos de bits de entrada e saída integrais, mais a memória necessária para as árvores de mensagens de apenas um registro. Essa técnica também fornece economia de memória, mesmo quando um pequeno número de repetições é encontrado na mensagem. O intermediário utiliza a análise parcial e a capacidade de analisar partes específicas da árvore de mensagens na parte correspondente do fluxo de bits.
Você pode variar estas técnicas para adequar o processamento necessário para suas mensagens.
-- Copiar o cabeçalho MQMD
SET OutputRoot.MQMD = InputRoot.MQMD;
-- Criar uma pasta especial na mensagem de saída para receber a
árvore de entrada
-- Obs.: SourceMessageTree é o elemento raiz de um analisador XML
CREATE LASTCHILD OF OutputRoot.XMLNS.Data DOMAIN 'XMLNS' NAME 'SourceMessageTree';
-- Copiar a mensagem de entrada em uma pasta especial na mensagem
de saída
-- Obs.: Esta é uma raiz para cópia de raiz que, portanto, não
construirá árvores
SET OutputRoot.XMLNS.Data.SourceMessageTree = InputRoot.XMLNS;
-- Criar uma pasta especial na mensagem de saída para receber a
árvore de saída
CREATE FIELD OutputRoot.XMLNS.Data.TargetMessageTree;
-- Preparar-se para examinar os itens adquiridos
DECLARE sourceCursor REFERENCE TO OutputRoot.XMLNS.Data.SourceMessageTree.Invoice;
DECLARE targetCursor REFERENCE TO OutputRoot.XMLNS.Data.TargetMessageTree;
DECLARE resultCursor REFERENCE TO OutputRoot.XMLNS.Data;
DECLARE grandTotal FLOAT 0.0e0;
-- Criar um bloco para que seja fácil sair do processamento
ProcessInvoice: BEGIN
-- Se não houver faturas na mensagem de entrada, não há nada a
fazer
IF NOT LASTMOVE(sourceCursor) THEN
LEAVE ProcessInvoice;
END IF;
-- Examinar as faturas na árvore de origem
InvoiceLoop : LOOP
-- Inspecionar a fatura atual e criar uma Instrução
correspondente
SET targetCursor.Statement = THE (SELECT 'Monthly' AS (XML.Attribute)Type,
'Full' AS (0x03000000)Style[1],
I.Customer.FirstName AS Customer.Name,
I.Customer.LastName AS Customer.Surname, I.Customer.Title AS Customer.Title,
(SELECT
FIELDVALUE(II.Title) AS Title,
CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
II.Quantity AS Qty
FROM I.Purchases.Item[] AS II
WHERE II.UnitPrice> 0.0) AS Purchases.Article[],
(SELECT
SUM( CAST(II.UnitPrice AS FLOAT) *
CAST(II.Quantity AS FLOAT) *
1.6 )
FROM I.Purchases.Item[] AS II) AS Amount,
'Dollars' AS Amount.(XML.Attribute)Currency
FROM sourceCursor AS I
WHERE I.Customer.LastName <> 'White');
-- Turn the current Statement into a bit stream
DECLARE StatementBitStream BLOB
ASBITSTREAM(targetCursor.Statement OPTIONS FolderBitStream);
-- If the SELECT produced a result
-- (that is, it was not filtered out by the WHERE clause),
-- process the Statement
IF StatementBitStream IS NOT NULL THEN
-- create a field to hold the bit stream in the result tree
CREATE LASTCHILD OF resultCursor
Type XML.BitStream
NAME 'StatementBitStream'
VALUE StatementBitStream;
-- Add the current Statement's Amount to the grand total
-- Note that the cast is necessary because of the behavior
-- of the XML syntax element
SET grandTotal = grandTotal
+ CAST(targetCursor.Statement.Amount AS FLOAT);
END IF;
-- Delete the real Statement tree leaving only the bit stream version
DELETE FIELD targetCursor.Statement;
-- Step onto the next Invoice,
-- removing the previous invoice and any
-- text elements that might have been
-- interspersed with the Invoices
REPEAT
MOVE sourceCursor NEXTSIBLING;
DELETE PREVIOUSSIBLING OF sourceCursor;
UNTIL (FIELDNAME(sourceCursor) = 'Invoice')
OR (LASTMOVE(sourceCursor) = FALSE)
END REPEAT;
-- Se não houver mais faturas para processar, abandonar o loop
IF NOT LASTMOVE(sourceCursor) THEN
LEAVE InvoiceLoop;
END IF;
END LOOP InvoiceLoop;
END ProcessInvoice;
-- Remove the temporary source and target folders
DELETE FIELD OutputRoot.XMLNS.Data.SourceMessageTree;
DELETE FIELD OutputRoot.XMLNS.Data.TargetMessageTree;
-- Finally add the grand total
SET resultCursor.GrandTotal = grandTotal;
<Data>
<Statement Type="Monthly" Style="Full">
<Customer>
<Name>Andrew</Name>
<Surname>Smith</Surname>
<Cargo>Mr</Cargo>
</Customer>
<Purchases>
<Article>
<Title>The XML Companion </Title>
<Cost>4.472E+1</Cost>
<Qty>2</Qty>
</Article>
<Article>
<Title>A Complete Guide to DB2 Universal Database</Title>
<Cost>6.872E+1</Cost>
<Qty>1</Qty>
</Article>
<Article>
<Title>JAVA 2 Developers Handbook</Title>
<Cost>9.5984E+1</Cost>
<Qty>1</Qty>
</Article>
</Purchases>
<Amount Currency="Dollars">2.54144E+2</Amount>
</Statement>
<GrandTotal>2.54144E+2</GrandTotal>
</Data>