Mustercode 'Message Routing' mithilfe einer Datenbank erweitern

Sie können den ESQL-Code des Mustercodes 'Message Routing' ändern, sodass sie ihn auch in anderen Nachrichtenflüssen verwenden können.

Nachrichtenfluss 'Routing_using_database_and_memory_cache' wiederverwenden

Die ESQL-Datei Routing_using_database_and_memory_cache enthält den gesamten ESQL-Code, der in der zwischengespeicherten Version des Mustercodes verwendet wird. Öffnen Sie diese Datei und suchen Sie nach folgendem Abschnitt (Section 1 in der ESQL-Datei):

Routing_using_database_and_memory_cache.esql

Die drei hervorgehobenen Abschnitte (Section 1, 2 und 3) müssen abhängig von der Nachricht, die mithilfe der ESQL-Datei weitergeleitet werden soll, geändert werden:

  1. Die drei ESQL-Variablen 'Variable1', 'Variable2' und 'Variable3' werden vom Rechenknoten für die Suche nach dem Ziel-WS-Manager und der Zielwarteschlange in der Datenbanktabelle verwendet. Diese Variablen können entweder fest codiert oder aus der eingehenden Nachricht abgeleitet werden. In diesem Mustercode ist der erste Wert fest codiert, während die anderen beiden aus der eingehenden XML-Nachricht abgeleitet werden. Es ist sinnvoll, den ersten Wert fest zu codieren, sodass ein anderer Wert für alle anderen Nachrichtenarten, die womöglich weitergeleitet werden müssen, verwendet werden kann. Dadurch kann eine Datenbanktabelle für viele verschiedene Gruppen der Weiterleitungsdaten verwendet werden. Um einen fest codierten Wert zu erstellen, muss der Wert in der Anweisung DECLARE festgelegt werden. Im Mustercode wird für 'Variable1' der Wert 'SAMPLE_QUEUES' festgelegt.
  2. Dieser Abschnitt in der ESQL-Datei gibt an, wie Sie Informationen aus der Nachricht zum Festlegen der anderen beiden Variablen verwenden können. Bei einem anderen Nachrichtentyp oder einem anderen Nachrichtenformat muss dieser Teil vollständig neu geschrieben und mit Verweisen auf die Felder in der eingehenden Nachricht versehen werden, die für die Weiterleitung verwendet werden.
  3. Wenn Probleme beim Festlegen der Variablen auftreten, werden Standardwerte verwendet. Im Mustercode werden diese Werte auf den Wert 'default' gesetzt.

Wenn Sie den ESQL-Code wiederverwenden, um eine Routing-Funktion in einem anderen Nachrichtenfluss bereitzustellen, können Sie den übrigen ESQL-Code unverändert lassen. Die Datenbanktabelle muss mit den neuen Einträgen aktualisiert werden, die für den neuen Nachrichtenfluss erforderlich sind. Weitere Informationen finden Sie im Datenbankscript setupRoutingDatabase, das mit dem Mustercode im Nachrichtenbrokerprojekt bereitgestellt wird.

Bei Verwendung der ESQL-Datei müssen Sie sicherstellen, dass in den Eigenschaften des Rechenknotens für Rechenmodus einer der folgenden Werte festgelegt wird, da die Routing-Informationen ansonsten verloren gehen:

Außerdem muss der ODBC-Quellenname der Datenbank im Feld Datenquelle den Eigenschaften des Rechenknotens hinzugefügt werden.

Geltungsbereich des Blocks BEGIN ATOMIC ... END; ändern

Die Anweisung BEGIN ATOMIC ... END; dient im Nachrichtenfluss 'Routing_using_memory_cache' dazu, sicherzustellen, dass immer nur ein Thread den Cache zu einem bestimmten Zeitpunkt verwenden kann. Die Einschränkung auf nur einen Thread in diesem Bereich der ESQL-Datei ist nur dann wichtig, wenn der Cache dynamisch aktualisiert wird. Wenn hingegen festgelegt wird, dass der Cache nicht aktualisiert zu werden braucht, solange der Nachrichtenfluss besteht, können Sie den Geltungsbereich des atomaren Blocks so reduzieren, dass er nur die Initialisierung des Cache abdeckt. Im folgenden Diagrammist die aktuelle ESQL-Datei dargestellt (unter der Überschrift 'Section 4' in der ESQL-Datei):

Moving Begin block
  1. BEGIN ATOMIC signalisiert, dass der folgende ESQL-Code von nur einem Thread verwendet werden darf, bis die entsprechende Anweisung END; erreicht wurde.
  2. Wenn der Cache nicht dynamisch aktualisiert wird, zeigt der mit der Nummer 4 markierte ESQL-Kommentar, wohin die Anweisung END; verschoben werden kann.
  3. Wenn eine neue END;-Anweisung bei der Markierung 4 eingefügt wird, muss die aktuelle END;-Anweisung entfernt werden.

Nachdem diese Änderung abgeschlossen wurde, ist die Suche nach dem Warteschlangennamen im Cache nicht mehr nur auf einen Thread eingeschränkt. Dies bedeutet, dass mehrere verschiedene Nachrichten gleichzeitig aus dem Cache gelesen werden können.

Externe Variablen verwenden, damit der Nachrichtenfluss leichter auf unterschiedlichen Systemen implementiert werden kann

Bei Verwendung von externen Variablen können fest codierte Werte in Nachrichtenflüssen auf die Nachrichtenflussebene hochgestuft werden, sodass sie zum Zeitpunkt des Einsatzes geändert werden können. Dies bedeutet, dass der Nachrichtenfluss zum Zeitpunkt der Implementierung an die Umgebung, in der er implementiert wird, angepasst werden kann, ohne dass der ESQL-Code des Nachrichtenflusses geändert werden muss.

Im Nachrichtenfluss 'Routing_using_database_and_memory_cache' wird die Variable 'Variable1' für die Suche in der Datenbank verwendet; sie ist fest codiert mit dem Wert SAMPLE_QUEUES. Diese Variable muss zum Zeitpunkt der Implementierung ausgelagert werden, damit ihr Wert in Abhängigkeit von dem System, auf dem die Implementierung ausgeführt wird, geändert werden kann. Auf diese Weise können Sie für jedes System eine andere Kombination aus Warteschlangen und WS-Manager, aber immer dieselbe Datenbanktabelle verwenden.

Gehen Sie folgendermaßen vor, um 'Variable1' zu einer externen Variable zu machen:

  1. Ändern Sie die ESQL-Datei, und deklarieren Sie 'Variable1' als externe Variable. Ändern Sie
    DECLARE Variable1 CHAR 'SAMPLE_QUEUES'
    in
    DECLARE Variable1 EXTERNAL CHAR 'SAMPLE_QUEUES'
    Der ESQL-Code muss wie in folgendem Beispiel aussehen:
    -- Section 1
    DECLARE Variable1 EXTERNAL CHAR 'SAMPLES_QUEUES';
    DECLARE Variable2 CHAR;
    DECLARE Variable3 CHAR;
  2. Jetzt muss die externe Variable auf der Ebene des Nachrichtenflusses definiert werden.
    1. Öffnen Sie den Nachrichtenfluss Routing_using_database_and_memory_cache und klicken Sie unten im Nachrichtenflusseditor auf die Registerkarte Benutzerdefinierte Eigenschaften.
    2. Erstellen Sie eine neue Eigenschaft mit dem Namen 'Variable1' und legen Sie SAMPLE_QUEUES als deren Standardwert fest:

      Benutzerdefinierte Eigenschaften

  3. Bei der Variablen 'Variable1' handelt es sich um eine externe Variable.
    1. Fügen Sie den Nachrichtenfluss in einer BAR-Datei hinzu und klicken Sie auf die Registerkarte Konfigurieren.
    2. Wählen Sie den Rechenknoten im Nachrichtenfluss aus und ändern Sie den Wert für folgende Variable:

      Editor für BAR-Datei

Damit Sie diese externe Variable verwenden können, müssen in der Datenbank ROUTING in der Tabelle ROUTING_TABLE, die andere Parameter für 'Variable1' enthält, neue Einträge erstellt werden. Wenn der Nachrichtenfluss implementiert wird, ohne dass der Wert von 'Variable1' geändert wird, funktioniert er wie zuvor. (Dies bedeutet, dass 'Variable1' standardmäßig den Wert SAMPLE_QUEUES annimmt).

Bedingungen für die Cache-Aktualisierung ändern

Dies ist momentan die Bedingung für die Aktualisierung des Cache der Datenbanktabelle für den Mustercode 'Message Routing':

Es ist hilfreich, wenn andere Bedingungen für eine Aktualisierung des Cache festgelegt werden. Möglich sind folgende Bedingungen:

  1. Cache wird nach einem bestimmten Zeitraum aktualisiert
  2. Cache wird nach einer bestimmten Anzahl an Nachrichten aktualisiert

Der Mustercode lässt sich so ändern, dass jede dieser Bedingungen verwendet werden kann. Folgende Stellen im ESQL-Code sind für die Aktualisierung des Cache wichtig:

ESQL-Code für Aktualisierungsbedingungen

So legen Sie als Aktualisierungsbedingung ein Zeitintervall von 60 Sekunden fest:

  1. Ändern Sie die im ESQL-Code rot umkreisten Kriterien wie folgt:
    IF CacheQueueTable.LastUpDate is null or (CURRENT_TIMESTAMP -
    CacheQueueTable.LastUpDate) second > INTERVAL '60' SECOND THEN
  2. Ändern Sie
    SET CacheQueueTable.valid = true;
    in
    SET CacheQueueTable.LastUpDate = CURRENT_TIMESTAMP;

So legen Sie fest, dass der Cache nach 100 Nachrichten aktualisiert wird:

  1. Ändern Sie die im ESQL-Code rot umkreisten Kriterien wie folgt:
    IF CacheQueueTable.MessageCount is null or
    CacheQueueTable.MessageCount > 100 SECOND THEN
  2. Ändern Sie
    SET CacheQueueTable.valid = true;
    in
    SET CacheQueueTable.MessageCount = 0;
  3. Fügen Sie am Ende des ESQL-Moduls eine Anweisung hinzu, um einen Zähler für die Nachrichten einzurichten:
    SET CacheQueueTable.MessageCount = CacheQueueTable.MessageCount
    +1;

Zurück zum Beginn des Mustercodes