Vorbereitungen:
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 für das Nachrichtenmanagement, den Zugriff auf Nachrichtenpuffer, die Navigation durch Syntaxelemente und den Zugriff auf Syntaxelemente 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. Sie können Elemente aus der Eingabenachricht kopieren, oder Sie können neue Elemente erstellen und diese an die Nachricht anhängen. 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 createElementAsFirstChild createElementAsLastChild createElementBefore createElementAsLastChildFromBitstreamDiese Methoden sollten verwendet werden, weil sie speziell für das Zuweisen eines Parsers zu einer Nachrichtenbaumstruktur vorgesehen sind.
createElementAfter createElementAfter createElementAsFirstChild createElementAsFirstChild createElementAsLastChild createElementAsLastChild createElementBefore createElementBefore
Knoten können ESQL-Ausdrücke mit der ESQL-Syntax des Rechenknotens aufrufen. Sie können die Komponenten der Nachricht unter Verwendung von ESQL-Ausdrücken erstellen und ändern, und Sie können auf Elemente der Eingabenachricht und Daten aus einer externen Datenbank verweisen.
String dataSourceName = "myDataSource";
String statement = "SET OutputRoot.XML.data = (SELECT Field2 FROM Database.Table1 WHERE Field1 = 1);";
String statement = "PASSTHRU( 'INSERT INTO Database.Table1 VALUES( InputRoot.XML.DataField1, InputRoot.XML.DataField2)');";
int transactionType = MbSQLStatement.SQL_TRANSACTION_AUTO;
MbSQLStatement sql = createSQLStatement(dataSourceName, statement, transactionType);Sie können die Methode createSQLStatement(dataSource, statement) verwenden, um als Transaktionstyp standardmäßig den Wert MbSQLStatement.SQL_TRANSACTION_AUTO festzulegen).
MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, assembly.getMessage());
sql.select(assembly, newAssembly);
sql.execute(assembly);
Weitere Informationen zu ESQL finden Sie unter Übersicht zu ESQL.
Mit Hilfe der Klasse 'mbException' fangen Sie Ausnahmebedingungen ab und greifen darauf zu. Die Klasse 'mbException' gibt eine Feldgruppe von Ausnahmeobjekten zurück, die die untergeordneten Elemente einer Ausnahmebedingung in der Ausnahmeliste des Brokers darstellen. Jedes zurückgegebene Element gibt seinen Ausnahmetyp an. Wenn eine Ausnahmebedingung keine untergeordneten Elemente hat, wird eine leere Feldgruppe zurückgegeben. Im folgenden Codebeispiel ist ein Beispiel für die Syntax der Klasse 'MbException' dargestellt.
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException { try { // plug-in functionality } catch(MbException ex) { traverse(ex, 0); throw ex; // if re-throwing, it must be the original exception that was caught } } void traverse(MbException ex, int level) { if(ex != null) { // Do whatever action here System.out.println("Level: " + level); System.out.println(ex.toString()); System.out.println("traceText: " + ex.getTraceText()); // traverse the hierarchy MbException e[] = ex.getNestedExceptions(); int size = e.length; for(int i = 0; i < size; i++) { traverse(e[i], level + 1); } } }
Weitere Informationen zur Verwendung der Klasse 'mbException' finden Sie in der Javadoc.
Sie können einen benutzerdefinierten Nachrichtenverarbeitungs- oder Sendeknoten so entwickeln, dass er auf alle aktuellen Ausnahmebedingungen zugreifen kann. Sie können beispielsweise die Klasse 'MbSQLStatement' verwenden, um Datenbankausnahmebedingungen abzufangen. Diese Klasse legt den Wert des Attributs 'throwExceptionOnDatabaseError' fest, das das Verhalten des Brokers bestimmt, wenn ein Datenbankfehler auftritt. Wenn dieser Wert auf 'True' festgelegt wird, kann eine Ausnahmebedingung abgefangen und von der benutzerdefinierten Erweiterung bearbeitet werden.
Im folgenden Codebeispiel ist ein Beispiel für die Verwendung der Klasse 'MbSQLStatement' dargestellt.
public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException { MbMessage newMsg = new MbMessage(assembly.getMessage()); MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg); String table = assembly.getMessage().getRootElement().getLastChild().getFirstChild().getName(); MbSQLStatement state = createSQLStatement( "dbName", "SET OutputRoot.XML.integer[] = PASSTHRU('SELECT * FROM " + table + "');" ); state.setThrowExceptionOnDatabaseError(false); state.setTreatWarningsAsErrors(true); state.select( assembly, newAssembly ); int sqlCode = state.getSQLCode(); if(sqlCode != 0) { // Do error handling here System.out.println("sqlCode = " + sqlCode); System.out.println("sqlNativeError = " + state.getSQLNativeError()); System.out.println("sqlState = " + state.getSQLState()); System.out.println("sqlErrorText = " + state.getSQLErrorText()); } getOutputTerminal("out").propagate(assembly); }
Bevor Sie eine Nachricht weitergeben, müssen Sie entscheiden, welche Nachrichtenflussdaten Sie weitergeben möchten und welches Terminal des Knotens die Daten empfangen soll. Sie sollten die Nachricht abschließen, bevor Sie sie weitergeben. Nach der Weitergabe einer Nachricht müssen Sie die Ausgabenachricht löschen.
MbOutputTerminal out = getOutputTerminal("out"); out.propagate(newAssembly);
newMsg.clearMessage();
Um Daten in eine Ausgabeeinheit zu schreiben, muss die logische (hierarchische) Nachricht wieder in einen Bitstrom konvertiert werden. Verwenden Sie dazu die Methode getBuffer in MbMessage wie folgt:
public void evaluate( MbMessageAssembly assembly, MbInputTerminal in) throws MbException { MbMessage msg = assembly.getMessage(); byte[] bitstream = msg.getBuffer(); // write the bitstream out somewhere writeBitstream( bitstream ); // user method }
Normalerweise wird die Nachricht für einen Sendeknoten nicht an ein Ausgabeterminal weitergegeben, deshalb können Sie die Steuerung an diesem Punkt zurückgeben.