Vorbereitungen
WebSphere Message Broker stellt die Quelle für die zwei benutzerdefinierten Beispielknoten 'Umschaltungsknoten' und 'TransformNode' bereit. Sie können diese Knoten in ihrem aktuellen Zustand verwenden, oder Sie können sie ändern.
Konzeptionell wird ein Nachrichtenverarbeitungsknoten zur Verarbeitung einer Nachricht und ein Sendeknoten zur Ausgabe einer Nachricht als Bitstrom verwendet. Wenn Sie jedoch einen Nachrichtenverarbeitungsknoten oder einen Sendeknoten codieren, sind sie im Wesentlichen identisch. Sie können an einem Sendeknoten Nachrichten verarbeiten, und ebenso können Sie mit einem Nachrichtenverarbeitungsknoten eine Nachricht als Bitstrom ausgeben. Der Einfachheit halber wird der Knoten in diesem Abschnitt hauptsächlich als Nachrichtenverarbeitungsknoten bezeichnet, es werden jedoch die Funktionen beider Knotentypen beschrieben.
Das Fenster 'Java Settings' (Java-Einstellungen) wird angezeigt.
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 Methode evaluate wird vom Broker für jede Nachricht aufgerufen, die den Nachrichtenfluss durchläuft.
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. Hier erstellen Sie die Terminals des Knotens und initialisieren Standardwerte für Attribute.
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, deshalb müssen Sie sie in eine neue Ausgabenachricht schreiben, bevor sie umgewandelt werden kann. Es können Elemente aus der Eingabenachricht kopiert werden, oder es können neue Elemente in der Ausgabenachricht erstellt werden.
Neue Elemente befinden sich im Allgemeinen in der Domäne eines Parsers.
Die Klasse MbMessage stellt die Kopierkonstruktoren und Methoden bereit, um das Stammelement der Nachricht abzurufen. Die Klasse MbElement bildet die Schnittstelle zu den Syntaxelementen.
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)
createElementAfter(int) createElementAfter(int, String, Object) createElementAsFirstChild(int) createElementAsFirstChild(int, String, Object) createElementAsLastChild(int) createElementAsLastChild(int, String, Object) createElementBefore(int) createElementBefore(int, String, Object)
Bevor Sie eine Nachricht weitergeben, müssen Sie entscheiden, welche Nachrichtenflussdaten Sie weitergeben möchten und welches Terminal des Knotens 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.
Sie müssen den Namen des Knotens deklarieren, da er von der Workbench identifiziert wird. Alle Knotennamen müssen mit "Node" enden. Sie deklarieren den Namen mit der folgenden Methode:
public static String getNodeName() { return "BasicNode"; }
package com.ibm.pluginsamples; public class BasicNode extends MbNode implements MbNodeInterface { ...
Knotenattribute deklarieren Sie genauso wie Java-Bean-Eigenschaften. Sie müssen Getter- und Setter-Methoden für die Attribute schreiben, und das API-Framework leitet davon die Attributnamen mit Hilfe der Java-Bean-Introspektionsregeln ab. Wenn Sie beispielsweise die folgenden beiden Methoden deklarieren:
private String attributeVariable; public String getFirstAttribute() { return attributeVariable; } publc void setFirstAttribute(String value) { attributeVariable = value; }
Dann folgert der Broker daraus, dass dieser Knoten über ein Attribut mit dem Namen 'firstAttribute' verfügt. Dieser Name wird von den Namen der get- oder set-Methoden abgeleitet, nicht von internen Klassenmitgliedsvariablennamen. Attribute können nur als Zeichenfolgen angezeigt werden, deshalb müssen Sie numerische Typen in den get- oder set-Methoden in bzw. aus Zeichenfolgen konvertieren. Die folgende Methode definiert beispielsweise ein Attribut mit dem Namen 'timeInSeconds':
int seconds; public String getTimeInSeconds() { return Integer.toString(seconds); } public void setTimeInSeconds(String value) { seconds = Integer.parseInt(value); }
Wie im Vorigen beschrieben müssen Sie für Nachrichtenverarbeitungs- oder Sendeknoten die Methode evaluate implementieren, die in MbNodeInterface definiert ist. Diese Methode wird vom Broker für die Verarbeitung der Nachricht aufgerufen. Sie sollte alle Verarbeitungsfunktionen für den Knoten bereitstellen.
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.
Die Methode onDelete wird wie folgt implementiert:
public void onDelete() { // perform node cleanup if necessary }