Es wird ein Empfangsknoten verwendet, um eine Nachricht in einem Nachrichtenfluss zu empfangen, normalerweise von einer Quelle, die nicht von den integrierten Empfangsknoten unterstützt wird.
Ein benutzerdefinierter Java-Knoten wird als Datei mit der Erweiterung .jar verteilt.
Vor der Erstellung von Java-Knoten im WebSphere Message Broker Toolkit müssen Sie ein Java-Projekt erstellen:
Jede Klasse, durch die MbInputNodeInterface implementiert wird und die im LIL-Pfad des Brokers enthalten ist, wird mit dem Broker als Empfangsknoten registriert. Bei der Implementierung von MbInputNodeInterface müssen Sie auch eine run-Methode für diese Klasse implementieren. Die Methode run zeigt den Start des Nachrichtenflusses an, enthält die Daten, in der die Nachricht erfasst wird, und gibt die Daten an den Fluss weiter. Der Broker ruft die Methode run auf, wenn Threads entsprechend dem angegebenen Threading-Modell verfügbar sind.
Der Klassenname muss mit dem Wort 'Node' enden. Wenn der Name beispielsweise 'BasicInput' im WebSphere Message Broker Toolkit lautet, muss der Klassenname 'BasicInputNode' lauten.
Wenn Sie beispielsweise die Klasse des Empfangsknotens deklarieren möchten, gehen Sie folgendermaßen vor:
package com.ibm.jplugins;
import com.ibm.broker.plugin.*;
public class BasicInputNode extends MbInputNode implements MbInputNodeInterface
{
...
Führen Sie die folgenden Schritte aus, um diese Aktion in der WebSphere Message Broker Toolkit vollständig durchzuführen:
Wenn der Knotens instanziiert wird, wird der Konstruktor der Knotenklasse aufgerufen. In dieser Klasse können Sie die Knotenterminals erstellen und die Standardwerte für die Attribute initialisieren.
Einem Empfangsknoten sind eine Reihe von Ausgabeterminals zugeordnet, er verfügt jedoch normalerweise nicht über Eingabeterminals. Verwenden Sie die Methode createOutputTerminal, um einem Knoten Ausgabeterminals hinzuzufügen, wenn eine Instanz des Knotens erstellt wird. Im Folgenden finden Sie ein Beispiel für die Erstellung eines Knotens mit drei Ausgabeterminals:
public BasicInputNode() throws MbException
{
createOutputTerminal ("out");
createOutputTerminal ("failure");
createOutputTerminal ("catch");
setAttribute ("firstParserClassName","myParser");
attributeVariable = "none";
}
Ein Empfangsknoten kann wie alle anderen Java-Programm Daten aus allen Arten von externen Quellen, z. B. einem Dateisystem, einer Warteschlange oder einer Datenbank, empfangen, wenn die Ausgabe des Knotens im richtigen Format vorliegt.
Sie müssen einen Eingabepuffer (oder einen Bitstrom) bereithalten, in dem Eingabedaten enthalten sind, und ihn einem Nachrichtenobjekt zuordnen. Dann erstellen Sie mit der Methode createMessage der Klasse MbInputNode eine Nachricht aus einer Bytefeldgruppe und anschließend generieren Sie aus dieser Nachricht eine gültige Nachrichtenassemblierung. Wenn Sie beispielsweise die Eingabedaten aus einer Datei lesen möchten, gehen Sie wie folgt vor:
Wenn Sie eine Nachrichtenassemblierung erstellt haben, können Sie diese an eines der Ausgangsterminals weitergeben, die Sie auf dem Knoten definiert haben.
MbOutputTerminal out = getOutputTerminal("out");
out.propagate(newAssembly);
msg.clearMessage();
Rufen Sie zum Löschen des Speichers, der der Nachrichtenbaumstruktur zugeordnet ist, die clearMessage()-Funktion innerhalb des letztenTry/Catch-Blocks auf.
Die Broker-Infrastruktur verarbeitet Transaktionen wie das Festschreiben einer WebSphere MQ- oder Datenbank-Arbeitseinheit, wenn die Nachrichtenverarbeitung abgeschlossen ist. Allerdings befinden sich Ressourcen, die in einem benutzerdefinierten Knoten geändert wurden, nicht zwangsläufig unter transaktionsorientierter Steuerung des Brokers.
Jeder Thread eines Nachrichtenflusses wird aus einem Thread-Pool zugewiesen, der für jeden Nachrichtenfluss verwaltet wird, und beginnt in der Methode run.
Der benutzerdefinierte Knoten verwendet Rückgabewerte, um anzugeben, ob eine Transaktion erfolgreich war, um zu steuern, ob Transaktionen festgeschrieben oder zurückgesetzt werden, und um zu steuern, wann der Thread an den Pool zurückgegeben wird. Die Infrastruktur des Brokers fängt alle nicht behandelten Ausnahmebedingungen ab und setzt die Transaktion zurück.
Das Verhalten von Transaktionen und Threads wird mithilfe eines entsprechenden Rückgabewerts bestimmt:
public int run( MbMessageAssembly assembly ) throws MbException
{
byte[] data = getDataWithTimeout(); // vom Benutzer angegebene Methode
// gibt bei Zeitlimitüberschreitung null zurück
if( data == null )
return TIMEOUT;
MbMessage msg = createMessage( data );
msg.finalizeMessage( MbMessage.FINALIZE_VALIDATE );
MbMessageAssembly newAssembly =
new MbMessageAssembly( assembly, msg );
dispatchThread();
getOutputTerminal( "out" ).propagate( newAssembly );
return SUCCESS_RETURN;
}
Sie müssen den Namen des Knotens deklarieren, damit dieser von der WebSphere Message Broker Toolkit verwendet und identifiziert werden kann. Alle Knotennamen müssen die Endung "Node" haben. Deklarieren Sie den Namen mit der folgenden Methode:
public static String getNodeName()
{
return "BasicInputNode";
}
package com.ibm.pluginsamples;
public class BasicInputNode extends MbInputNode implements MbInputNodeInterface
{
...
Deklarieren Sie Knotenwerte auf die gleiche Weise die Eigenschaften von Java-Beans. Die get- und set-Methoden müssen für die Attribute geschrieben werden; 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 get- oder set-Methoden abgeleitet, und nicht von den Variablennamen von Mitgliedern interner Klassen. 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. 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 beschrieben, wird die Methode run vom Broker zur Erstellung der Eingabenachricht aufgerufen. Durch diese Methode wird die erforderliche Verarbeitungsfunktion für den Empfangsknoten bereitgestellt.
Eine Empfangsknotenimplementierung bestimmt normalerweise, welcher Nachrichten-Parser eine Eingabenachricht anfangs analysiert. Beispiel: Der integrierte MQInput-Knoten gibt an, dass ein MQMD-Parser für die Syntaxanalyse des MQMD-Headers erforderlich ist. Ein benutzerdefinierter Empfangsknoten kann einen geeigneten Header oder Nachrichten-Parser und den Modus, in dem die Syntaxanalyse gesteuert wird, mithilfe der folgenden Standardattribute auswählen, die enthalten sind und die Sie überschreiben können:
Implementieren Sie die Methode onDelete wie folgt:
public void onDelete()
{
// bei Bedarf Knotenbereinigung ausführen
}