Vorbereitungen
WebSphere Message Broker stellt die Quelle für die zwei benutzerdefinierten Beispielknoten 'Umschaltungsknoten' und 'TransformNode' bereit. Diese Knoten können in ihrem aktuellen Zustand verwendet oder von Ihnen angepasst werden.
Konzeptionell wird ein Nachrichtenverarbeitungsknoten zur Verarbeitung einer Nachricht und ein Sendeknoten zur Ausgabe einer Nachricht als Bitstrom verwendet. Beim Codieren eines Nachrichtenverarbeitungsknotens und eines Sendeknotens handelt es sich jedoch um das Gleiche. Sie können an einem Sendeknoten Nachrichten verarbeiten, und ebenso können Sie mit einem Nachrichtenverarbeitungsknoten eine Nachricht als Bitstrom ausgeben. Zur Vereinfachung wird in diesem Abschnitt von einem Nachrichtenverarbeitungsknoten gesprochen, auch wenn die Funktionen beider Knotentypen erläutert werden.
Die Anzeige 'Java Settings' (Java-Einstellungen) erscheint.
Jede Klasse, durch die MbNodeInterface implementiert wird und im LIL-Pfad des Brokers enthalten ist, wird im Broker als Nachrichtenverarbeitungsknoten registriert. Bei der Implementierung von MbNodeInterface, muss auch eine evaluate-Methode für diese Klasse implementiert werden. Die evaluate-Methode wird vom Broker für jede Nachricht aufgerufen, die durch den Fluss übermittelt wird.
package com.ibm.jplugins; import com.ibm.broker.plugin.*; public class BasicNode extends MbNode implements MbNodeInterface
Wenn eine Instanz des Knotens erstellt wird, wird der Konstruktor der Knotenklasse des Benutzers aufgerufen. Dabei können Sie die Knotenterminals erstellen und Standardwerte für die Attribute initialisieren.
Einem Nachrichtenverarbeitungsknoten sind eine Reihe von Eingabeterminals und Ausgabeterminals zugeordnet. Die Methoden createInputTerminal und createOutputTerminal werden verwendet, um einem Knoten Terminals hinzuzufügen, wenn eine Instanz des Knotens erstellt wird. Im Folgenden finden Sie ein Beispiel für die Erstellung eines Knotens mit einem Eingabeterminal und zwei Ausgabeterminals:
public MyNode() throws MbException { // create terminals here createInputTerminal ("in"); createOutputTerminal ("out"); createOutputTerminal ("failure"); }
In vielen Fällen muss der benutzerdefinierte Knoten auf den Inhalt der Nachricht zugreifen, die an seinem Eingabeterminal empfangen wurde. Die Nachricht wird als Baumstruktur aus Syntaxelementen dargestellt. Gruppen von Dienstprogrammfunktionen werden zur Verwendung in der evaluate-Methode bereitgestellt. Sie werden für Nachrichtenmanagement, Zugriff auf Nachrichtenpuffer sowie für Navigation der Syntaxelemente und Zugriff darauf bereitgestellt.
Die Klasse MbElement bildet die Schnittstelle zu den Syntaxelementen. Weitere Informationen zur Java-API finden Sie in der Javadoc.
Beispiel:
Die empfangene Eingabenachricht ist schreibgeschützt. Vor dem Umwandeln einer Nachricht müssen Sie diese deshalb in eine neue Ausgabenachricht schreiben. Es können Elemente aus der Eingabenachricht kopiert werden, oder es können neue Elemente in der Ausgabenachricht erstellt werden. Die neuen Elemente befinden sich normalerweise in der Domäne des Parsers.
Durch die Klasse MbMessage werden die Copy-Konstruktoren und die Methoden zum Abrufen des Stammelements der Nachricht bereitgestellt. Durch die Klasse MbElement wird die Schnittstelle für die Syntaxelemente bereitgestellt.
MbMessage newMsg = new MbMessage(assembly.getMessage()); MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg);
MbElement rootElement = newAssembly.getMessage().getRootElement(); MbElement switchElement = rootElement.getFirstElementByPath("/XML/data/action");
String elementValue = (String)switchElement.getValue(); if(elementValue.equals("add")) switchElement.setValue("change"); else if(elementValue.equals("change")) switchElement.setValue("delete"); else if(elementValue.equals("delete")) switchElement.setValue("hold"); else switchElement.setValue("failure");
MbElement tag = switchElement.createElementAsLastChild(MbElement.TYPE_NAME, "PreviousValue", elementValue);
tag.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE, "NewValue", switchElement.getValue()); MbOutputTerminal out = getOutputTerminal("out");
createElementAfter(String) createElementAsFirstChild(String) createElementAsLastChild(String) createElementBefore(String) createElementAsLastChildFromBitstream(byte[], String, String, String, String, int, int, int)Diese Methoden sollten verwendet werden, weil sie speziell für das Zuweisen eines Parsers zu einer Nachrichtenbaumstruktur vorgesehen sind.
createElementAfter(int) createElementAfter(int, String, Object) createElementAsFirstChild(int) createElementAsFirstChild(int, String, Object) createElementAsLastChild(int) createElementAsLastChild(int, String, Object) createElementBefore(int) createElementBefore(int, String, Object)
Vor dem Weitergeben einer Nachricht müssen Sie entscheiden, welche Nachrichtenflussdaten weitergegeben werden und welches Knotenterminal die Daten empfangen soll.
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
Rufen Sie zum Löschen des Speichers, der der Nachrichtenbaumstruktur zugeordnet ist, die clearMessage()-Funktion innerhalb des letzten Try-/Catch-Blocks auf.
Der Knotennamen muss so deklariert werden, wie er von der Workbench gekennzeichnet wird. Alle Knotennamen müssen die Endung "Node" haben. Deklarieren Sie die Namen mit der folgenden Methode:
public static String getNodeName() { return "BasicNode"; }
package com.ibm.pluginsamples; public class BasicNode extends MbNode implements MbNodeInterface { ...
Knotenattribute werden auf die gleiche Weise deklariert wie Eigenschaften von JavaBeans. Die Methoden GET und SET müssen für die Attribute geschrieben werden, und das API-Framework schließt aus den Regeln für die JavaBean-Introspektion auf die Attributnamen. Sie können beispielsweise die folgenden zwei Methoden deklarieren:
private String attributeVariable; public String getFirstAttribute() { return attributeVariable; } publc void setFirstAttribute(String value) { attributeVariable = value; }
Der Broker schließt daraus, dass in diesem Knoten ein Attribut mit der Bezeichnung 'firstAttribute' enthalten ist. Dieser Name wird von den Namen der Methoden zum Abrufen und Festlegen abgeleitet, und nicht von den Variablennamen von Mitgliedern interner Klassen. Attribute können nur als Zeichenfolgen festgelegt werden. Deshalb müssen numerische Werte in den Methoden zum Abrufen und Festlegen in Zeichenfolgen umgewandelt werden. In der folgenden Methode wird beispielsweise ein Attribut mit der Bezeichnung 'timeInSeconds' definiert:
int seconds; public String getTimeInSeconds() { return Integer.toString(seconds); } public void setTimeInSeconds(String value) { seconds = Integer.parseInt(value); }
Wie bereits für die Nachrichtenverarbeitung oder für Sendeknoten beschrieben, müssen Sie die Methode evaluate implementieren, die in MbNodeInterface definiert ist. Diese Methode wird vom Broker zur Verarbeitung der Nachricht aufgerufen. Durch diese Methode wird die erforderliche Verarbeitungsfunktion für den Knoten bereitgestellt.
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException { // add message processing code here getOutputTerminal("out").propagate(assembly); }
Die Nachrichtenflussdaten, die aus der Nachricht, der globalen Umgebung, der lokalen Umgebung und der Ausnahmeliste bestehen, werden am Eingabeterminal des Knotens empfangen.
Implementieren Sie die Methode onDelete folgendermaßen:
public void onDelete() { // perform node cleanup if necessary }