WebSphere Message Broker, Versão 8.0.0.5 Sistemas operacionais: AIX, HP-Itanium, Linux, Solaris, Windows, z/OS

Consulte as informações sobre a versão mais recente do produto em IBM Integration Bus, Versão 9.0

Trabalhando com Mensagens XML Grandes

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.

Quando um fluxo de bits de entrada é analisado e uma árvore lógica é criada, a representação da árvore de uma mensagem XML é geralmente maior e, em alguns casos, muito maiores, que o fluxo de bits correspondente.
As razões para essa expansão incluem os seguintes fatores:
  • A inclusão de ponteiros que vinculam os objetos em conjunto
  • Conversão de dados de caracteres em Unicode, o que pode duplicar o tamanho
  • A inclusão de nomes de campos que podem ter sido implícitos no fluxo de bits
  • A presença de dados de controle associados à operação 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.

Para utilizar essas técnicas no nó Compute, execute algumas das etapas a seguir.
  • Copie o corpo da mensagem de entrada como um fluxo de bits em uma pasta especial na mensagem de saída. Essa ação cria uma cópia modificável da mensagem de entrada que não é analisada e, portanto, utiliza uma quantidade mínima de memória.
  • Evite qualquer inspeção da mensagem de entrada, que evita a necessidade de analisar a mensagem.
  • Utilize um loop e uma variável de referência para percorrer a mensagem, um registro de cada vez. Para cada registro, utilize os seguintes processos:
    • Utilize transformações normais para construir uma subárvore de saída correspondente em uma segunda pasta especial.
    • Utilize a função ASBITSTREAM para gerar um fluxo de bits para a subárvore de saída. o fluxo de bits gerado é armazenado em um elemento BitStream que é colocado na posição na subárvore de saída que corresponde a sua posição necessária no fluxo de bits final.
    • Utilize a instrução DELETE para excluir as árvores de mensagens de registro de entrada e saída atuais quando concluir a sua manipulação.
    • Ao concluir o processamento de todos os registros, desacople as pastas especiais para que não apareçam no fluxo de bits de saída.

Você pode variar estas técnicas para adequar o processamento necessário para suas mensagens.

O código ESQL a seguir fornece um exemplo de uma implementação e é uma modificação do exemplo de ESQL em Transformando uma Mensagem Complexa. Ele utiliza uma única instrução SET com funções SELECT aninhadas para transformar uma mensagem que contém estruturas aninhadas de repetição.
-- 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; 
Esse código ESQL produz a seguinte mensagem de saída:
<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>  
Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback

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

        
        Última atualização:
        
        Última atualização: 2015-02-28 18:28:54


Tópico de TarefaTópico de Tarefa | Versão 8.0.0.5 | ac67176_