Estensione delle capacità di un nodo di output o di elaborazione dei messaggi in Java

Prima di iniziare

Assicurarsi di aver letto e appreso il seguente argomento:
Una volta creato un nodo definito dall'utente, sono disponibili le seguenti funzioni:
  1. Accesso a ESQL
  2. Gestione di eccezioni
  3. Scrittura su un'unità di output

Accesso a ESQL

I nodi possono richiamare espressioni ESQL utilizzando la sintassi ESQL del nodo Compute. E' possibile creare e modificare i componenti del messaggio utilizzando espressioni ESQL ed è possibile fare riferimento agli elementi sia del messaggio di input che dei dati provenienti da un database esterno.

La procedura riportata di seguito mostra come gestire le transazioni dal metodo evaluate nel nodo definito dall'utente utilizzando ESQL:
  1. Impostare il nome dell'origine di dati ODBC da utilizzare. Ad esempio:
    String dataSourceName = "myDataSource";
  2. Impostare l'istruzione ESQL da eseguire:
    String statement = 
       "SET OutputRoot.XML.data = 
              (SELECT Field2 FROM Database.Table1 WHERE Field1 = 1);";
    Oppure, se si desidera eseguire un'istruzione che non restituisca alcun risultato:
    String statement = "PASSTHRU(
                            'INSERT INTO Database.Table1 VALUES(
                                 InputRoot.XML.DataField1,
                                 InputRoot.XML.DataField2)');";
  3. Selezionare il tipo di transazione desiderata fra quelle riportate di seguito:
    MbSQLStatement.SQL_TRANSACTION_COMMIT
    Effettua immediatamente il commit della transazione una volta eseguita l'istruzione ESQL.
    MbSQLStatement.SQL_TRANSACTION_AUTO
    Effettua il commit della transazione una volta completato il flusso di messaggi. L'esecuzione di rollback avviene se necessario.
    Ad esempio:
    int transactionType = MbSQLStatement.SQL_TRANSACTION_AUTO;
  4. Fornire l'istruzione ESQL. Ad esempio:
    MbSQLStatement sql = 
           createSQLStatement(dataSourceName, statement, transactionType);
    E' possibile utilizzare il metodo createSQLStatement(dataSource, statement) per impostare come valore predefinito il tipo di transazione su MbSQLStatement.SQL_TRANSACTION_AUTO).
  5. Creare il nuovo assemblaggio di messaggi che deve essere distribuito:
    MbMessageAssembly newAssembly = 
           new MbMessageAssembly(assembly, assembly.getMessage());
  6. Eseguire l'istruzione ESQL:
    sql.select(assembly, newAssembly);
    Oppure, se si desidera eseguire un'istruzione ESQL che non restituisca alcun risultato:
    sql.execute(assembly);

Per ulteriori informazioni su ESQL, fare riferimento a Panoramica di ESQL.

Gestione di eccezioni

La classe MbException viene utilizzata per acquisire ed accedere alle eccezioni. La classe MbException restituisce un array di oggetti eccezione rappresentante i child di un'eccezione nel relativo elenco del broker. Ciascun elemento restituito specifica il relativo tipo di eccezione. Se un'eccezione non ha child viene restituito un array vuoto. L'esempio di codice riportato di seguito mostra uno dei modi in cui la classe MbException può essere utilizzata nel metodo evaluate del nodo definito dall'utente.

public void evaluate(MbMessageAssembly assembly, MbInputTerminal inTerm) throws MbException
  {
    try
      {

        // funzionalità plug-in

      }
    catch(MbException ex)
      {
        traverse(ex, 0);

        throw ex; // se in fase di rigenerazione, deve essere l'eccezione di origine acquisita
      }
  }

  void traverse(MbException ex, int level)
  {
    if(ex != null)
      {
        // Eseguire qui qualunque azione
        System.out.println("Level: " + level);
        System.out.println(ex.toString());
        System.out.println("traceText:  " + ex.getTraceText());

        // spostamento nella gerarchia
        MbException e[] = ex.getNestedExceptions();
        int size = e.length;
        for(int i = 0; i < size; i++)
          {
            traverse(e[i], level + 1);
          }
      }
  }

Per ulteriori informazioni sull'uso della classe MbException, fare riferimento alla documentazione Java.

E' possibile sviluppare un nodo di output o di elaborazione dei messaggi definiti dall'utente in modo che possa accedere a tutte le eccezioni attuali. Ad esempio, per acquisire le eccezioni di database è possibile utilizzare la classe MbSQLStatement. Tale classe imposta il valore dell'attributo 'throwExceptionOnDatabaseError', che determina il funzionamento del broker quando rileva un errore di database. Quando è impostato su "true", se viene generata un'eccezione questa può essere acquisita e gestita dal metodo evaluate nell'estensione definita dall'utente.

L'esempio di codice riportato di seguito mostra uno dei modi in cui è possibile utilizzare la classe MbSQLStatement.

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)
      {
        // Eseguire qui la gestione errori

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

Scrittura su un'unità di output

Per scrivere su un'unità di output, il messaggio (gerarchico) logico deve essere riconvertito in un flusso di bit nel metodo evaluate. A tal fine, utilizzare il metodo getBuffer in MbMessage, come riportato di seguito:

public void evaluate(MbMessageAssembly assembly, MbInputTerminal in)
                                                     throws MbException
{
  MbMessage msg = assembly.getMessage();
  byte[] bitstream = msg.getBuffer();

  // scrive il flusso di bit in qualche posto
  writeBitstream( bitstream );   // metodo utente

 }

Di solito, relativamente ad un nodo di output, il messaggio non viene distribuito su alcun terminale di output, giungendo quindi a questo punto.

Nota: quando si scrive sulle code WebSphere MQ, è necessario utilizzare il nodo MQOutput fornito, in quanto il broker mantiene internamente una connessione WebSphere MQ e handle di coda aperta su base thread-by-thread e questi vengono inseriti nella cache per ottimizzare le prestazioni. Inoltre, il broker gestisce scenari di ripristino quando si verificano determinati eventi WebSphere MQ e ciò potrebbe avere effetti negativi se in un nodo di output definito dall'utente sono state utilizzate chiamate MQI WebSphere MQ.
Riferimenti correlati
Struttura dell'elenco di eccezioni
Informazioni particolari | Marchi | Download | Libreria | Supporto | Commenti
Copyright IBM Corporation 1999, 2006 Ultimo aggiornamento: ago 17, 2006
as24990_