Nachrichten in der BLOB-Domäne bearbeiten

Dieses Thema enthält Informationen, die sich speziell auf die Verarbeitung von Nachrichten beziehen, die der BLOB-Domäne angehören und vom BLOB-Parser syntaktisch analysiert werden.

Der Inhalt einer BLOB-Nachricht kann nicht bearbeitet werden, da sie über keine vordefinierte Struktur verfügt. Sie können sich jedoch unter Verwendung ihrer bekannten Position im Bitstrom auf ihren Inhalt beziehen und die Nachricht mit minimaler Kenntnis über ihren Inhalt verarbeiten.

Der BLOB-Parser für den Nachrichtenhauptteil erstellt keine Baumstruktur wie andere Parser für Nachrichtenhauptteile. Er verfügt über das Stammelement BLOB, dem wiederum das Element BLOB untergeordnet ist, das die Daten enthält.

Sie können mit Hilfe von Unterzeichenfolgen auf den Nachrichteninhalt verweisen, wenn Sie die Position einer bestimmten Einzelinformation in den BLOB-Daten kennen. Der folgende Ausdruck identifiziert beispielsweise das zehnte Byte des Nachrichtenhauptteils:

InputBody.BLOB.BLOB[10]

Der folgende Ausdruck verweist auf 10 Bytes der Nachrichtendaten, beginnend an der relativen Position 10:

SUBSTRING(InputBody.BLOB.BLOB from 10 for 10)

Beispiel der BLOB-Nachrichtenbearbeitung

Dieses Beispiel zeigt die Bearbeitung einer BLOB-Nachricht variabler Länge. In dem Beispiel wird davon ausgegangen, dass Sie einen Nachrichtenfluss konfiguriert haben, der eine BLOB-Nachricht variabler Länge empfängt, einige Felder durch den Aufruf des MRM-Parsers syntaktisch analysiert und die Ausgabenachricht auf Basis der analysierten Informationen an die richtige Ausgabewarteschlange weiterleitet.

Die Eingabenachricht hat das BLOB-Format, und es wird vorausgesetzt, dass sie eingebettete Nullen ('x00') enthält. Sie kann also nicht als 'mit Null beendet' definiert werden.

Im vorliegenden Beispiel wird der ESQL-Code dargestellt, der für folgende Aktionen erforderlich ist:

  • Die Berechnung der Länge der BLOB-Nachricht
  • Deren Konvertierung in ein Hexadezimalformat
  • Deren Einfügung an den Anfang der BLOB-Nachricht

Durch diese Aktionen können Sie das Nachrichtenmodell mit einem Integer-Längenfeld definieren, gefolgt von der BLOB-Nachricht.

In diesem Beispiel wird auch demonstriert, wie die BLOB-Nachricht in CWF konvertiert, die Nachricht verarbeitet und das hinzugefügte Längenfeld abgeschnitten wird.

Im vorliegenden Beispiel hat der Eingabedatensatz das folgende Format:

  • Versionsnummer: Zeichenfolge, 11 Zeichen
  • Speichernummer: Zeichenfolge, 10 Zeichen

    Dieses Feld wird als Ganzzahl verwendet, um die Nachricht je nach den vom Kunden definierten Kriterien an verschiedene Warteschlangen weiterzuleiten.

  • Speicherdaten: Binäre Daten variabler Länge

Neue Nachricht definieren

Definieren Sie die neue Nachricht 'BLOB_Example', die folgende Elemente und Typen enthält:

  • B_LEN, xsd:integer
  • VERSION_NUM, xsd:string, Length 11
  • STORE_NUM, xsd:string, Length 10
  • BIN_BLOB, xsd:binary, Length Value B_LEN

Nachrichtenfluss erstellen

In diesem Abschnitt werden die Merkmale des Nachrichtenflusses beschrieben. Wenn Sie diesen Nachrichtenfluss implementieren möchten, müssen Sie die Definition des Nachrichtenflusses abschließen (indem Sie beispielsweise die drei Unterflüsse erstellen, um die an dieser Stelle verwendeten Sendeknoten für die Verarbeitung der Fälle 'Falsch', 'Unbekannt' und 'Fehler' zu ersetzen). Außerdem müssen Sie die erforderliche Unterstützung für dessen Implementierung und Ausführung bereitstellen (indem Sie beispielsweise die eingehenden und ausgehenden Warteschlangen auf dem WS-Manager für den Broker erstellen, für den der Fluss implementiert werden soll).

  1. Erstellen Sie den untergeordneten Fluss LESS_THAN. Diese Task wird im Abschnitt Untergeordneten Fluss LESS_THAN erstellen beschrieben.
  2. Erstellen Sie einen neuen Nachrichtenfluss. Fügen Sie der Ansicht 'Nachrichtenflusseditor' folgende Knoten hinzu: einen MQEmpfangsknoten, einen Rechenknoten, einen Knoten 'Deskriptor_für_Neuanalyse', einen Filterknoten, drei MQSendeknoten und den untergeordneten Fluss LESS_THAN.
  3. Ändern Sie den Namen des MQEmpfangsknotens in INQUEUE, und setzen Sie seine Eigenschaft Warteschlangenname auf INQUEUE.
  4. Verbinden Sie das Ausgabeterminal mit dem Rechenknoten.
  5. Ändern Sie den Namen des Rechenknotens von seinem Standardwert in 'Add_length'. Konfigurieren Sie den Rechenknoten für die Berechnung der Länge des BIN_BLOB, und fügen Sie diesen am Anfang der Nachricht 'BLOB_Example' im Feld 'B_LEN' hinzu:
    1. Klicken Sie mit der rechten Maustaste auf den Knoten, und klicken Sie auf ESQL öffnen.
    2. Codieren Sie den folgenden ESQL-Code im Modul für diesen Knoten:
      -- Deklaration lokaler Variablen
      DECLARE I      INTEGER 1;
      DECLARE J      INTEGER CARDINALITY(InputRoot.*[]);
      DECLARE MSGLEN CHARACTER; 
      DECLARE NUMBER INTEGER; 
      DECLARE RESULT INTEGER; 
      DECLARE REM    INTEGER; 
      
      -- Kopieren von Nachrichtenheadern
      WHILE I < J DO
        SET OutputRoot.*[I] = InputRoot.*[I];
        SET I = I + 1;
                               END WHILE;
      -- 
      -- Festlegen von MSGLEN auf Nicht-NULL, um bei der erstmaligen Verkettung Fehler zu vermeiden --
      SET MSGLEN = 'X'; 
      -- 
      -- Abrufen der BLOB-Länge und Subtrahierung der Länge von VERSION_NUM und STORE_NUM (11+10)
      SET NUMBER = LENGTH("InputRoot"."BLOB"."BLOB")-21; 
      -- 
      -- Konvertierung von NUMBER in Hexadezimalzahl. Der Rest der Division durch 16 wird rekursiv berechnet.-- 
      WHILE NUMBER > 15 DO      
         SET RESULT = NUMBER/16;      
         SET REM    = NUMBER - RESULT*16;      
         SET MSGLEN = 
          CASE
            WHEN REM < 10  THEN CAST(REM AS CHARACTER) || MSGLEN               
            WHEN REM = 10  THEN 'A' || MSGLEN              
            WHEN REM = 11  THEN 'B' || MSGLEN              
            WHEN REM = 12  THEN 'C' || MSGLEN              
            WHEN REM = 13  THEN 'D' || MSGLEN               
            WHEN REM = 14  THEN 'E' || MSGLEN              
            ELSE                'F' || MSGLEN          
                       END;
         SET NUMBER = RESULT; 
                               END WHILE;
      SET REM = NUMBER;     
      SET MSGLEN =           
         CASE                
           WHEN REM < 10  THEN CAST(REM AS CHARACTER) || MSGLEN               
           WHEN REM = 10  THEN 'A' || MSGLEN              
           WHEN REM = 11  THEN 'B' || MSGLEN              
           WHEN REM = 12  THEN 'C' || MSGLEN              
           WHEN REM = 13  THEN 'D' || MSGLEN               
           WHEN REM = 14  THEN 'E' || MSGLEN              
           ELSE                'F' || MSGLEN          
         END;
      -- 
      -- Hinzufügen führender Nullen (0) bis zu einer Länge 9, damit eine Umsetzung als BLOB möglich ist.
      -- Der Anfang beginnt bei auf X gesetztem MSGLEN (Länge 1)
      WHILE LENGTH(MSGLEN) < 9 DO       
         SET MSGLEN = '0' || MSGLEN; END WHILE; 
      -- 
      -- Änderung in entsprechendes Endian-Format (PLATTFORMABHÄNGIG)
      -- Ist keine Endian-Auslagerung erforderlich, muss wie folgt das letzte Zeichen gelöscht werden --
      SET MSGLEN = SUBSTRING(MSGLEN FROM 1 FOR 8); 
      -- 
      SET MSGLEN = SUBSTRING(MSGLEN FROM 7 FOR 2) || SUBSTRING(MSGLEN FROM 5 FOR 2) ||
                   SUBSTRING(MSGLEN FROM 3 FOR 2) || SUBSTRING(MSGLEN FROM 1 FOR 2);
      SET "OutputRoot"."BLOB"."BLOB" = CAST(MSGLEN AS BLOB) || "InputRoot"."BLOB"."BLOB"; 
      
  6. Verbinden Sie das Ausgangsterminal des Rechenknotens mit dem Knoten 'Deskriptor_für_Neuanalyse'.
  7. Ändern Sie den Namen des Knotens 'Deskriptor_für_Neuanalyse' in 'ResetContent_2_MRM'. Konfigurieren Sie den Knoten wie folgt:
    1. Setzen Sie die Nachrichtendomäne auf MRM.
    2. Wählen Sie das Markierungsfeld Nachrichtendomäne zurücksetzen aus.
    3. Setzen Sie die Nachrichtengruppe auf die ID der Nachrichtengruppe, in der Sie die Nachricht 'BLOB_Example' definiert haben.
    4. Wählen Sie das Markierungsfeld Nachrichtengruppe zurücksetzen aus.
    5. Setzen Sie den Nachrichtentyp auf BLOB_Example.
    6. Wählen Sie das Markierungsfeld Nachrichtentyp zurücksetzen aus.
    7. Setzen Sie auf den Namen des physischen CWF-Formats, das Sie definiert haben (beispielsweise den Standardwert CWF1).
    8. Wählen Sie das Markierungsfeld Nachrichtenformat zurücksetzen aus.
  8. Verbinden Sie das Ausgangsterminal des Knotens 'Deskriptor_für_Neuanalyse' mit dem Filterknoten.
  9. Ändern Sie den Namen des Filterknotens in 'Route_2_QUEUE'. Konfigurieren Sie den Knoten wie folgt:
    1. Klicken Sie mit der rechten Maustaste auf den Knoten, und klicken Sie auf ESQL öffnen.
    2. Codieren Sie die folgende ESQL-Anweisung im ESQL-Modul für diesen Knoten:
      CAST("Body"."e_STORE_NUM" AS INTEGER) < 151    

      Diese Anweisung basiert auf der willkürlichen Annahme, dass eine die Speichernummer einer eingehenden Nachricht unter 151 liegt und dass diese Nachricht an eine bestimmte Warteschlange weitergeleitet wird. Sie können jeden beliebigen anderen Test ausführen, der sich eignet.

  10. Verbinden Sie die Filter-Ausgabeterminals wie folgt:
    1. Das TRUE-Terminal mit einem Knoten des untergeordneten Flusses (siehe unten) namens LESS_THAN.
    2. Das FALSE-Terminal mit einem MQSendeknoten namens GREATER_THAN. Die Eigenschaft Warteschlangenname muss auf GREATER_THAN gesetzt sein.
    3. Das UNBEKANNT-Terminal mit einem MQSendeknoten namens INVALID. Die Eigenschaft Warteschlangenname muss auf INVALID gesetzt sein.
    4. Das FEHLER-Terminal mit einem MQSendeknoten namens ERROR. Die Eigenschaft Warteschlangenname muss auf ERROR gesetzt sein.

Untergeordneten Fluss LESS_THAN erstellen

Dieser untergeordnete Fluss verarbeitet eine Nachricht, die das erwartete Format hat (der im Filterknoten ausgeführte Test ergab 'True'). Die Nachricht über den Erfolg wird in ihrem Originalformat in die Ausgabewarteschlange geschrieben; sie wird von MRM wieder in das BLOB-Format konvertiert, und die hinzugefügten vier Bytes (Feld B_LEN) werden entfernt.

Für diesen untergeordneten Fluss gilt Folgendes:

  1. Erstellen Sie einen neuen Nachrichtenfluss namens 'LESS_THAN'.
  2. Fügen Sie in der Editoransicht einen Empfangsknoten, einen Knoten 'Deskriptor_für_Neuanalyse', einen Rechenknoten und einen MQSendeknoten hinzu.
  3. Ändern Sie den Namen des Empfangsknotens in 'InputTerminal1', und verbinden Sie dessen Ausgangsterminal mit dem Knoten 'Deskriptor_für_Neuanalyse'.
  4. Ändern Sie den Namen des Knotens 'Deskriptor_für_Neuanalyse' in 'ResetContent_2_BLOB', und konfigurieren Sie den Knoten:
    1. Setzen Sie die Nachrichtendomäne auf BLOB.
    2. Wählen Sie das Markierungsfeld Nachrichtendomäne zurücksetzen aus.
  5. Verbinden Sie das Ausgabeterminal des Knotens 'Deskriptor_für_Neuanalyse' mit dem Rechenknoten.
  6. Ändern Sie den Namen des Rechenknotens in 'Remove_length', und konfigurieren Sie den Knoten:
    1. Klicken Sie mit der rechten Maustaste auf den Knoten, und klicken Sie auf ESQL öffnen.
    2. Codieren Sie den folgenden ESQL-Code im Modul für diesen Knoten:
      -- Kopieren von Nachrichtenheadern
      DECLARE I      INTEGER 1;
      DECLARE J      INTEGER CARDINALITY(InputRoot.*[]);
      
      WHILE I < J DO
        SET OutputRoot.*[I] = InputRoot.*[I];
        SET I = I + 1;
                               END WHILE;
      -- 
      -- Entfernen des zuvor hinzugefügten Längenfelds mit 4 Bytes --
      SET "OutputRoot"."BLOB"."BLOB" = SUBSTRING("InputRoot"."BLOB"."BLOB" FROM 5);

      Dieser Rechenknoten entfernt die vier Bytes, die am Anfang der BLOB-Nachricht zur Unterstützung ihrer Bearbeitung hinzugefügt wurden.

      Beachten Sie die Verwendung der Variable 'J', die mit dem Wert der Kardinalität initialisiert wird, der für die bereits vorhandenen Header in der Nachricht gilt. Dies ist effizienter als die Berechnung der Kardinalität in jeder einzelnen Iteration der Schleife; dies ist der Fall, wenn Sie die folgende WHILE-Anweisung codieren:

      WHILE I < CARDINALITY(InputRoot.*[]) DO
  7. Verbinden Sie das Ausgangsterminal des Rechenknotens mit dem MQSendeknoten.
  8. Ändern Sie den Namen des MQSendeknotens in 'Output_success', und konfigurieren Sie den Knoten. Legen Sie dabei die Eigenschaften WS-Managername und Name der Warteschlange. Es kann hilfreich sein, diese Eigenschaften des MQSendeknotens weiterzugeben, damit Sie diese auf der Nachrichtenflussebene angeben können.
Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Rückmeldung
Copyright IBM Corporation 1999, 2005 Letzte Aktualisierung: Nov 17, 2005
ac11640_