Vorbereitungen
Die Anzeige 'Java Settings' (Java-Einstellungen) erscheint.
Jede Klasse, durch die MbInputNodeInterface implementiert wird und im LIL-Pfad des Brokers enthalten ist, wird mit dem Broker als Empfangsknoten registriert. Bei der Implementierung von MbInputNodeInterface muss auch eine run-Methode für diese Klasse implementiert werden. 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 gemäß dem angegebenen Threading-Modell verfügbar werden.
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 { ...
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 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 jedes andere Java-Programm Daten aus allen Arten von externen Quellen, z. B. einem Dateisystem, einer Warteschlange oder einer Datenbank, empfangen, solange 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 ein gültiges Nachrichten-Assembly. Weitere Informationen zu diesen Methoden finden Sie im Abschnitt Java-API. Wenn Sie beispielsweise die Eingabe aus einer Datei lesen möchten, gehen Sie wie folgt vor:
Wenn Sie ein Nachrichten-Assembly erstellt haben, können Sie dies an einen der Terminals des Knotens weitergeben.
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 letzten Try-/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 die Ausführung 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. Alle nicht verarbeiteten Ausnahmebedingungen werden von der Broker-Infrastruktur abgefangen, und die Transaktion wird zurückgesetzt.
Sie bestimmen das Verhalten von Transaktionen und Threads, indem Sie den entsprechenden Rückgabewert verwenden:
public int run( MbMessageAssembly assembly ) throws MbException { byte[] data = getDataWithTimeout(); // user supplied method // returns null if timeout 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; }
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 "BasicInputNode"; }
package com.ibm.pluginsamples; public class BasicInputNode extends MbInputNode implements MbInputNodeInterface { ...
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 beschrieben, wird die Methode run vom Broker zur Erstellung der Eingabenachricht aufgerufen. Durch diese Methode wird die erforderliche Verarbeitungsfunktion für den Empfangsknoten bereitgestellt.
Die Implementierung eines Empfangsknotens bestimmt normalerweise, durch welchen Nachrichtenparser eine Eingabenachricht anfangs syntaktisch analysiert wird. Beispiel: Der Primitive-Knoten MQInput gibt an, dass ein MQMD-Parser für die Syntaxanalyse des MQMD-Headers erforderlich ist. Durch einen benutzerdefinierten Empfangsknoten können ein entsprechender Header oder Nachrichtenparser sowie der Modus ausgewählt werden, durch den die Syntaxanalyse gesteuert wird, indem die folgenden, standardmäßig enthaltenen Attribute verwendet werden, die überschrieben werden können:
Implementieren Sie die Methode onDelete folgendermaßen:
public void onDelete() { // perform node cleanup if necessary }