Ampliación de la capacidad de un nodo de salida o proceso de mensajes Java

En un nodo de proceso o salida de mensajes, puede añadir funciones ampliadas al nodo Java™ .

Antes de empezar

Lea Creación de un nodo de proceso o salida de mensajes en Java.

Acerca de esta tarea

Acceso a ESQL

Acerca de esta tarea

Los nodos pueden invocar expresiones ESQL utilizando la sintaxis ESQL de nodo de Cálculo . Puede crear y modificar los componentes del mensaje utilizando expresiones ESQL y puede hacer referencia a los elementos del mensaje de entrada y de los datos de una base de datos externa.

El procedimiento siguiente muestra cómo utilizar ESQL para controlar las transacciones del método evaluate en el nodo definido por el usuario:
  1. Establezca el nombre del origen de datos ODBC que se debe utilizar. Por ejemplo:
    String dataSourceName = "myDataSource";
    
  2. Establezca la sentencia ESQL que se debe ejecutar:
    String statement = 
       "SET OutputRoot.XMLNS.data = 
              (SELECT Field2 FROM Database.Table1 WHERE Field1 = 1);";
    
    O bien, si desea ejecutar una sentencia que no devuelva ningún resultado:
    String statement = "PASSTHRU(
                            'INSERT INTO Database.Table1 VALUES(
                                 InputRoot.XMLNS.DataField1,
                                 InputRoot.XMLNS.DataField2)');";
    
  3. Seleccione la transacción que desea entre los tipos siguientes:
    MbSQLStatement.SQL_TRANSACTION_COMMIT
    Confirmar inmediatamente la transacción después de que se haya completado la sentencia ESQL.
    MbSQLStatement.SQL_TRANSACTION_AUTO
    Confirmar la transacción cuando se haya completado el flujo de mensajes. (Si es necesario se realizan restituciones.)
    Por ejemplo:
    int transactionType = MbSQLStatement.SQL_TRANSACTION_AUTO;
  4. Obtenga la sentencia ESQL. Por ejemplo:
    MbSQLStatement sql = 
           createSQLStatement(dataSourceName, statement, transactionType);
    
    Puede utilizar el método createSQLStatement(data, statement) para tomar por omisión el tipo de transacción MbSQLStatement.SQL_TRANSACTION_AUTO).
  5. Cree el nuevo conjunto de mensajes que se debe propagar:
    MbMessageAssembly newAssembly = 
           new MbMessageAssembly(assembly, assembly.getMessage());
    
  6. Ejecute la sentencia ESQL:
    sql.select(assembly, newAssembly);
    O bien, si desea ejecutar una sentencia ESQL que no devuelva ningún resultado:
    sql.execute(assembly);
    

Interacción con bases de datos

Acerca de esta tarea

Puede interactuar con bases de datos desde el código Java del nodo de proceso de mensajes. El soporte que se proporciona es idéntico al soporte para el código Java que escribe para el nodo JavaCompute ; para obtener detalles de las opciones disponibles y las ventajas y restricciones que se aplican, consulte Interacción con bases de datos utilizando el nodo JavaCompute.

Manejo de excepciones

Acerca de esta tarea

Utilice la clase MbException para detectar excepciones y acceder a ellas. La clase MbException devuelve una matriz de objetos de excepción que representan los hijos de una excepción en la lista de excepciones de nodo de integración. Cada elemento devuelto especifica su tipo de excepción. Si una excepción no tiene hijos, se devuelve una matriz vacía. El siguiente código de ejemplo muestra un ejemplo de cómo podría utilizar la clase MbException en el método evaluate del nodo definido por el usuario

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

Puede desarrollar un proceso de mensaje definido por el usuario o un nodo de salida de tal forma que éste pueda acceder a todas las excepciones actuales. Por ejemplo, para detectar excepciones, puede utilizar la clase MbSQLStatement. Esta clase establece el valor del atributo 'throwExceptionOnDatabaseError', que determina el comportamiento de nodo de integración cuando encuentra un error de base de datos. Si se establece en verdadero, cuando se genera una excepción, el método evaluate puede detectarla y manejarla en la extensión definida por el usuario.

El siguiente código de ejemplo muestra un ejemplo de cómo utilizar la clase 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.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);
  }

Grabación en un dispositivo de salida

Acerca de esta tarea

Para grabar en un dispositivo de salida, es necesario volver a convertir el mensaje lógico (jerárquico) a una corriente de bits en su método evaluate. Utilice el método getBuffer en MbMessage para realizar esta tarea:


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

 }

Normalmente, dado que para un nodo de salida el mensaje no se propaga a ningún terminal de salida, simplemente puede volver a este punto.

Debe utilizar el nodo MQOutput proporcionado al grabar en colas WebSphere® MQ , porque el nodo de integración mantiene internamente una conexión WebSphere MQ y los manejadores de colas abiertos en una base de hebra por hebra. Estos manejadores se colocan en la memoria caché para optimizar el rendimiento. Además, el nodo de integración maneja casos de excepción cuando se producen determinados sucesos de WebSphere MQ , y esta recuperación se ve afectada negativamente si se utilizan llamadas de WebSphere MQ MQI en un nodo de salida definido por el usuario.