Ein Nachrichtenverarbeitungsknoten wird zur Verarbeitung einer Nachricht und ein Sendeknoten zur Ausgabe einer Nachricht als Bitstrom verwendet.
WebSphere Message Broker stellt die Quelle für die zwei benutzerdefinierten Musterknoten 'SwitchNode' und 'TransformNode' bereit. Sie können diese Knoten in ihrem aktuellen Zustand verwenden oder sie ändern.
Im Hinblick auf die Codierung eines Nachrichtenverarbeitungsknotens und eines Sendeknotens lässt sich feststellen, dass die beiden Typen im Wesentlichen dieselben Services bereitstellen. Sie können an einem Sendeknoten Nachrichten verarbeiten, und ebenso können Sie mit einem Nachrichtenverarbeitungsknoten eine Ausgabenachricht als Bitstrom weitergeben. Zur Vereinfachung wird in diesem Abschnitt von einem Nachrichtenverarbeitungsknoten gesprochen, auch wenn die Funktionen beider Knotentypen erläutert werden.
Ein benutzerdefinierter Java-Knoten wird als Datei mit der Erweiterung .jar verteilt.
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.
Der Klassenname muss mit dem Wort 'Node' enden. Wenn Sie z. B. den Namen als 'Basic' im WebSphere Message Broker Toolkit zugeordnet haben, muss der Klassenname 'BasicNode' lauten.
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. Erstellen Sie die Terminals des Knotens, und initialisieren Sie in diesem Konstruktor 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. Nutzen Sie die mitgelieferte Dienstprogrammfunktion, um Methoden für das Nachrichtenmanagement, den Nachrichtenpufferzugriff, die Syntaxelementnavigation und den Syntaxelementzugriff auszuwerten (evaluate).
Durch die Klasse MbElement wird die Schnittstelle für die Syntaxelemente bereitgestellt.
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.
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)
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 ob diese an ein Knotenterminal oder an einen Label-Knoten weitergegeben werden sollen.
MbOutputTerminal out = getOutputTerminal("out");
out.propagate(newAssembly);
MbRoute label1 = getRoute ("label1");
Label1.propagate(newAssembly);
Rufen Sie die Funktion clearMessage() im letzten Try/Catch-Block auf, um den Speicher zu löschen, der für die Nachrichtenbaumstruktur zugeordnet ist.
MbMessage newMsg = new MbMessage(assembly.getMessage());
MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg);
...
newMsg.finalizeMessage(MbMessage.FINALIZE_NONE);
out.propagate(newAssembly;
...
newMsg.finalizeMessage(MbMessage.FINALIZE_NONE);
out.propagate(newAssembly);
Der Name des Knotens muss mit dem Knoten identisch sein, der im WebSphere Message Broker Toolkit verwendet wird. Alle Knotennamen müssen die Endung "Node" haben. Deklarieren Sie den 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 Java-Beans. Sie müssen getter- und setter-Methoden für die Attribute schreiben. Das API-Framework schließt aus den Regeln für die Java-Bean-Introspektion auf die Attributnamen. Sie können beispielsweise die folgenden zwei Methoden deklarieren:
private String attributeVariable;
public String getFirstAttribute()
{
return attributeVariable;
}
public 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);
}
Die in MbNodeInterface definierte Methode evaluate wird vom Broker für die Verarbeitung der Nachricht aufgerufen. Die gesamte Verarbeitungsfunktion für den Knoten ist in dieser Methode enthalten.
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 Umgebung, der lokalen Umgebung und der Ausnahmeliste bestehen, werden am Eingangsterminal des Knotens empfangen.
public void onDelete()
{
// bei Bedarf Knotenbereinigung ausführen
}
Diese Methode wird sofort vom Broker aufgerufen, bevor er den Knoten löscht.