Funktionalität eines Java-Nachrichtenverarbeitungsknotens oder Java-Sendeknotens erweitern

Vorbereitungen:

Stellen Sie sicher, dass Sie folgenden Abschnitt gelesen und verstanden haben:

Auf Nachrichtendaten zugreifen

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:

  1. So navigieren Sie zum relevanten Syntaxelement in der XML-Nachricht:
        MbElement rootElement = assembly.getMessage().getRootElement();
        MbElement switchElement = 
    			rootElement.getLastChild().getFirstChild().getFirstChild();
  2. So wählen Sie das Terminal aus, das durch den Wert dieses Elements angegeben wird:
        String terminalName;
        String elementValue = (String)switchElement.getValue();
        if(elementValue.equals("add"))
          terminalName = "add";
        else if(elementValue.equals("change"))
          terminalName = "change";
        else if(elementValue.equals("delete"))
          terminalName = "delete";
        else if(elementValue.equals("hold"))
          terminalName = "hold";
        else
          terminalName = "failure";
        
        MbOutputTerminal out = getOutputTerminal(terminalName);

Nachrichtenobjekt umwandeln

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.

Gehen Sie bei einem ankommenden Nachrichten-Assembly mit eingebetteten Nachrichten beispielsweise wie folgt vor:
  1. Erstellen Sie eine neue Kopie des Nachrichten-Assemblys und seinen eingebetteten Nachrichten:
        MbMessage newMsg = new MbMessage(assembly.getMessage());
        MbMessageAssembly newAssembly = new MbMessageAssembly(assembly, newMsg);
  2. Navigieren Sie zum relevanten Syntaxelement in der XML-Nachricht:
        MbElement rootElement = newAssembly.getMessage().getRootElement();
        MbElement switchElement = 
    			rootElement.getFirstElementByPath("/XML/data/action");
  3. Ändern Sie den Wert eines vorhandenen Elements:
      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");
  4. Fügen Sie eine neue Kennung als untergeordnetes Element der Switch-Kennung hinzu:
        MbElement tag = switchElement.createElementAsLastChild(MbElement.TYPE_NAME,
                                                               "PreviousValue",
                                                               elementValue);
  5. Fügen Sie ein Attribut zu dieser neuen Kennung hinzu:
        tag.createElementAsFirstChild(MbElement.TYPE_NAME_VALUE,
                                      "NewValue",
                                      switchElement.getValue());
    
        MbOutputTerminal out = getOutputTerminal("out");
Als Teil der Umsetzung kann es erforderlich sein, einen neuen Nachrichtenhauptteil zu erstellen. Zum Erstellen eines neuen Nachrichtenhauptteils sind folgende Methoden verfügbar:
createElementAfter
createElementAsFirstChild
createElementAsLastChild
createElementBefore
createElementAsLastChildFromBitstream
Diese Methoden sollten verwendet werden, weil sie speziell für das Zuweisen eines Parsers zu einer Nachrichtenbaumstruktur vorgesehen sind.
Beim Erstellen eines Nachrichtenhauptteils dürfen folgende Methoden nicht verwendet werden, weil sie dem Ordner keinen Parser als Eigner zuordnen:
createElementAfter
createElementAfter
createElementAsFirstChild
createElementAsFirstChild
createElementAsLastChild
createElementAsLastChild
createElementBefore
createElementBefore 

Auf ESQL zugreifen

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.

Im Folgenden wird die Vorgehensweise bei der Steuerung von Transaktionen im benutzerdefinierten Knoten mit ESQL veranschaulicht:
  1. Legen Sie den Namen der ODBC-Datenquelle fest, die verwendet werden soll. Beispiel:
    String dataSourceName = "myDataSource";
  2. Legen Sie die ESQL-Anweisung fest, die ausgeführt werden soll:
    String statement = 
       "SET OutputRoot.XML.data = 
              (SELECT Field2 FROM Database.Table1 WHERE Field1 = 1);";
    Or, if you want to execute a statement that returns no result:
    String statement = "PASSTHRU(
                            'INSERT INTO Database.Table1 VALUES(
                                 InputRoot.XML.DataField1,
                                 InputRoot.XML.DataField2)');";
  3. Wählen Sie den gewünschten Transaktionstyp aus folgenden Typen aus:
    MbSQLStatement.SQL_TRANSACTION_COMMIT
    Die Transaktion wird sofort bei der Ausführung der ESQL-Anweisung festgeschrieben.
    MbSQLStatement.SQL_TRANSACTION_AUTO
    Die Transaktion wird festgeschrieben, wenn der Nachrichtenfluss beendet ist. (Gegebenenfalls werden ROLLBACK-Operationen ausgeführt.)
    Beispiel:
    int transactionType = MbSQLStatement.SQL_TRANSACTION_AUTO;
  4. Rufen Sie die ESQL-Anweisung ab. Beispiel:
    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).
  5. Erstellen Sie das neue Nachrichten-Assembly, das weitergegeben werden soll:
    MbMessageAssembly newAssembly = 
           new MbMessageAssembly(assembly, assembly.getMessage());
  6. Führen Sie die ESQL-Anweisung aus:
    sql.select(assembly, newAssembly);
    Oder folgende Anweisung, wenn Sie eine ESQL-Anweisung ausführen möchten, die kein Ergebnis zurückgibt:
    sql.execute(assembly);

Weitere Informationen zu ESQL finden Sie unter Übersicht zu ESQL.

Ausnahmebedingungen verarbeiten

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);
  }

Nachricht weitergeben

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.

Beispiel:
  1. So geben Sie die Nachricht an das Ausgabeterminal "out" weiter:
    MbOutputTerminal out = getOutputTerminal("out");
            out.propagate(newAssembly);
  2. So löschen Sie die Ausgabenachricht:
      newMsg.clearMessage();	

Daten in eine Ausgabeeinheit schreiben

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.

Anmerkung: Sie müssen den bereitgestellten MQSendeknoten verwenden, wenn Sie Daten inWebSphere MQ-Warteschlangen schreiben, da der Broker intern eine WebSphere MQ-Verbindung und offene Warteschlangenkennungen threadweise verwaltet und diese zwischengespeichert werden, um die Leistung zu optimieren. Außerdem verarbeitet der Broker Fehlerbehebungsszenarios, wenn bestimmte WebSphere MQ-Ereignisse auftreten, und dies würde durch die Verwendung von WebSphere MQ MQI-Aufrufen in einem benutzerdefinierten Sendeknoten beeinträchtigt.
Zugehörige Verweise
Struktur der Ausnahmeliste
Zugehörige Informationen
Benutzerdefinierte Java-Knoten-API
Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Rückmeldung
Copyright IBM Corporation 1999, 2005 Letzte Aktualisierung: Nov 17, 2005
as24990_