WebSphere Message Broker Version 8.0.0.5 Betriebssysteme: AIX, HP-Itanium, Linux, Solaris, Windows, z/OS

Sehen Sie sich die Informationen zur aktuellen Produktversion im IBM Integration Bus Version 9.0 an.

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

In einem Nachrichtenverarbeitungs- oder Sendeknoten können Sie Ihrem Java™-Knoten erweiterte Funktionen hinzufügen.

Vor dem Start

Lesen Sie Nachrichtenverarbeitungs- oder Sendeknoten in Java erstellen.

Auf ESQL zugreifen

Knoten können ESQL-Ausdrücke mit der ESQL-Syntax des Compute-Knotens 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 veranschaulicht, wie Transaktionen von der Methode evaluate in Ihrem benutzerdefinierten Knoten mithilfe von ESQL gesteuert werden:
  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.XMLNS.data = 
              (SELECT Field2 FROM Database.Table1 WHERE Field1 = 1);";
    Oder folgende Anweisung, wenn Sie eine Anweisung ausführen möchten, die kein Ergebnis zurückgibt:
    String statement = "PASSTHRU(
                            'INSERT INTO Database.Table1 VALUES(
                                 InputRoot.XMLNS.DataField1,
                                 InputRoot.XMLNS.DataField2)');";
  3. Wählen Sie unter den folgenden Typen die gewünschte Transaktion aus:
    MbSQLStatement.SQL_TRANSACTION_COMMIT
    Die Transaktion wird sofort nach Abschluss 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 mit der Methode createSQLStatement(data source, statement den Transaktionstyp auf den Standardwert 'MbSQLStatement.SQL_TRANSACTION_AUTO' setzen.
  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);

Mit Datenbanken interagieren

Sie können über den Java-Code im Nachrichtenverarbeitungsknoten mit Datenbanken interagieren. Die bereitgestellte Unterstützung ist identisch mit der Unterstützung für Java-Code, den Sie für den JavaCompute-Knoten schreiben. Weitere Informationen zu den verfügbaren Optionen sowie den Vorteilen und geltenden Einschränkungen finden Sie im Abschnitt Interaktion mit Datenbanken mithilfe des JavaCompute-Knotens.

Ausnahmebedingungen verarbeiten

Mithilfe 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. Das folgende Codemuster ist ein Beispiel für die Verwendung der Klasse MbException in der Methode evaluate des benutzerdefinierten Knotens.

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

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 und wenn eine Ausnahmebedingung ausgegeben wird, kann eine Ausnahmebedingung von der Methode evaluate in Ihrer benutzerdefinierten Erweiterung abgefangen und verarbeitet 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.XMLNS.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( newAssembly );
  }

Daten in eine Ausgabeeinheit schreiben

Um Daten in eine Ausgabeeinheit zu schreiben, muss die logische (hierarchische) Nachricht wieder in einen Bitstrom in Ihrer Methode evaluate konvertiert werden. Verwenden Sie zur Ausführung dieser Task die Methode getBuffer in MbMessage:

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.

Sie müssen den bereitgestellten MQOutput-Knoten verwenden, wenn Sie Daten in WebSphere MQ-Warteschlangen schreiben, da der Broker intern eine WebSphere MQ-Verbindung und offene Warteschlangenkennungen threadweise verwaltet. Diese werden zwischengespeichert, um die Leistung zu optimieren. Außerdem verarbeitet der Broker Ausnahmebedingungsszenarios, wenn bestimmte WebSphere MQ-Ereignisse auftreten, und dies würde durch die Verwendung von WebSphere MQ MQI-Aufrufen in einem benutzerdefinierten Sendeknoten beeinträchtigt.

Bemerkungen | Marken | Downloads | Bibliothek | Support | Feedback

Copyright IBM Corporation 1999, 2014Copyright IBM Corporation 1999, 2014.

        
        Letzte Aktualisierung:
        
        Letzte Aktualisierung: 2015-02-28 16:22:08


TaskthemaTaskthema | Version 8.0.0.5 | as24990_