WebSphere Message Broker Version 8.0.0.5 Betriebssysteme: AIX, HP-Itanium, Linux, Solaris, Windows, z/OS

Sehen Sie sich die Informationen zur aktuellen Produktversion im IBM Integration Bus Version 9.0 an.

Mit umfangreichen XML-Nachrichten arbeiten

Die Darstellung einer XML-Nachricht in Form einer Baumstruktur ist in der Regel umfangreicher als der Eingabebitstrom. Für die Bearbeitung einer umfangreichen Nachrichtenbaumstruktur kann viel Speicher erforderlich sein, die Speicherbelastung auf dem Broker kann jedoch mithilfe von ESQL-Anweisungen reduziert werden.

Wenn ein Eingabebitstrom syntaktisch analysiert und eine logische Baumstruktur erstellt wird, ist die Darstellung einer XML-Nachricht in Form einer Baumstruktur in der Regel umfangreicher, in einigen Fällen sogar wesentlich umfangreicher, als der Ausgangsbitstrom.
Hierfür sind u. a. folgende Faktoren verantwortlich:
  • Die Addition der Zeiger, mit denen die Objekte miteinander verknüpft werden
  • Die Umsetzung von Zeichendaten in Unicode, die den Umfang verdoppeln kann
  • Die Aufnahme von Feldnamen, die im Bitstrom möglicherweise implizit waren
  • Das Vorhandensein von Steuerdaten, die der Brokeroperation zugeordnet sind.

Für die Bearbeitung einer umfangreichen Nachrichtenbaumstruktur kann viel Speicher benötigt werden. Wenn Sie einen Nachrichtenfluss entwerfen, in dem umfangreiche Nachrichten mit sich wiederholenden Strukturen verarbeitet werden, können Sie ESQL-Anweisungen codieren und so den auf dem Broker erforderlichen Speicherplatz reduzieren. Diese Anweisungen unterstützen sowohl den wahlfreien als auch den sequenziellen Zugriff auf die Nachricht. Es wird jedoch vorausgesetzt, dass Sie nicht gleichzeitig auf die gesamte Nachricht zugreifen müssen.

Mit diesen ESQL-Anweisungen führt der Broker nur eine eingeschränkte Syntaxanalyse für die Nachricht durch und es wird nur jeweils der Teil der Nachrichtenbaumstruktur gespeichert, der einen einzelnen Datensatz darstellt. Wenn bei der Verarbeitung Informationen von Datensatz zu Datensatz beibehalten werden müssen (beispielsweise bei der Berechnung des Gesamtpreises auf der Basis sich wiederholender Artikel in einer Bestellung), können entweder ESQL-Variablen deklariert, initialisiert und verwaltet werden oder aber die Werte können in einem anderen Bereich der Nachrichtenbaumstruktur, beispielsweise in der lokalen Umgebung gespeichert werden.

Mit diesem Verfahren reduziert sich der Speicherbedarf des Brokers, es wird nur noch der Speicherplatz für die vollständigen Eingabe- und Ausgabebitströme sowie der Speicher für die Nachrichtenbaumstrukturen eines einzigen Datensatzes benötigt. Somit kann selbst dann Speicherplatz eingespart werden, wenn die Nachricht einige Wiederholungen aufweist. Der Broker führt nur eine teilweise Syntaxanalyse durch und nutzt die Möglichkeit, bestimmte Bereiche der Nachrichtenbaumstruktur in und aus dem entsprechenden Bereich des Bitstroms syntaktisch zu analysieren.

Führen Sie einen der folgenden Schritte aus, um diese Verfahren in Ihrem Compute-Knoten einzusetzen:
  • Kopieren Sie den Hauptteil der Eingabenachricht als Bitstrom in einen speziellen Ordner in der Ausgabenachricht. Auf diese Weise wird eine modifizierbare Kopie der Eingabenachricht erstellt, die nicht syntaktisch analysiert wird und daher nur einen minimalen Speicherbedarf hat.
  • Vermeiden Sie die Überprüfung der Eingabenachricht. Auf diese Weise wird die Notwendigkeit umgangen, die Nachricht syntaktisch zu analysieren.
  • Verwenden Sie eine Schleife und eine Referenzvariable, um jeweils einen Datensatz nach dem anderen in der Nachricht zu bearbeiten. Führen Sie für jeden Datensatz die folgenden Prozesse aus:
    • Erstellen Sie mithilfe normaler Umsetzungen in einem zweiten speziellen Ordner eine entsprechende untergeordnete Ausgabebaumstruktur.
    • Generieren Sie mithilfe der Funktion ASBITSTREAM einen Bitstrom für die untergeordnete Ausgabebaumstruktur. Der generierte Bitstrom wird im Element 'BitStream' gespeichert, das an der Stelle in der untergeordneten Baumstruktur eingefügt wird, die der erforderlichen Position im endgültigen Bitstrom entspricht.
    • Löschen Sie mithilfe der Anweisung DELETE die aktuellen Nachrichtenbaumstrukturen sowohl für die Ein- als auch die Ausgabedatensätze, wenn Sie ihre Bearbeitung abgeschlossen haben.
    • Sobald Sie die Verarbeitung aller Datensätze abgeschlossen haben, hängen Sie die speziellen Ordner ab, damit diese nicht im Ausgabebitstrom angezeigt werden.

Sie können diese Verfahren variieren und so an die Verarbeitung anpassen, die für Ihre Nachrichten erforderlich ist.

Der folgende ESQL-Code ist ein Beispiel einer Implementierung und stellt eine Modifikation des ESQL-Beispiels im Abschnitt Komplexe Nachricht umwandeln dar. In diesem Code wird mittels einer einzelnen SET-Anweisung mit verschachtelten SELECT-Funktionen eine Nachricht umgewandelt, die verschachtelte, sich wiederholende Strukturen enthält.
-- Copy the MQMD header
  SET OutputRoot.MQMD = InputRoot.MQMD;

-- Create a special folder in the output message to hold the input tree
-- Note : SourceMessageTree is the root element of an XML parser
  CREATE LASTCHILD OF OutputRoot.XMLNS.Data DOMAIN 'XMLNS' NAME 'SourceMessageTree';

-- Copy the input message to a special folder in the output message
-- Note : This is a root to root copy which will therefore not build trees
  SET OutputRoot.XMLNS.Data.SourceMessageTree = InputRoot.XMLNS;

-- Create a special folder in the output message to hold the output tree
  CREATE FIELD OutputRoot.XMLNS.Data.TargetMessageTree;

-- Prepare to loop through the purchased items
  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;

-- Create a block so that it's easy to abandon processing
  ProcessInvoice: BEGIN
  -- If there are no Invoices in the input message, there is nothing to do
    IF NOT LASTMOVE(sourceCursor) THEN
      LEAVE ProcessInvoice;
    END IF;

  -- Loop through the invoices in the source tree
  InvoiceLoop : LOOP
    -- Inspect the current invoice and create a matching Statement
    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;

    -- If there are no more invoices to process, abandon the 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; 
Dieser ESQL-Code erstellt die folgende Ausgabenachricht:
<Data>
 <Statement Type="Monthly" Style="Full">
  <Customer>
   <Name>Andrew</Name>
   <Surname>Smith</Surname>
   <Title>Mr</Title>
  </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>  
Bemerkungen | Marken | Downloads | Bibliothek | Support | Feedback

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

        
        Letzte Aktualisierung:
        
        Letzte Aktualisierung: 2015-02-28 16:20:29


TaskthemaTaskthema | Version 8.0.0.5 | ac67176_