Ampliación de las posibilidades de un nodo de entrada en C

Cuando haya creado un nodo definido por el usuario, podrá ampliar sus posibilidades.

Antes de empezar

Lea el tema Creación de un nodo de entrada en C.

Después de crear un nodo definido por el usuario, están disponibles las siguientes opciones:
  1. Recepción de datos externos en un almacenamiento intermedio
  2. Control del trabajo con hebras y de las transacciones
  3. Propagación del mensaje

Recepción de datos externos en un almacenamiento intermedio

Un nodo de entrada puede recibir datos de cualquier tipo de origen externo, por ejemplo un sistema de archivos o una conexión FTP, a condición de que la salida del nodo esté en el formato correcto. Para conexiones a colas o bases de datos, utilice los nodos incorporados y las llamadas de API proporcionadas, principalmente porque los nodos incorporados ya están configurados para el manejo de errores. No utilice las llamadas MQGET o MQPUT para el acceso directo a las colas de WebSphere MQ.

Debe proporcionar un almacenamiento intermedio de entrada (o corriente de bits) para que contenga los datos de entrada y asociarlo a un objeto de mensaje. En la API en C, el almacenamiento intermedio se conecta al objeto CciMessage que representa el mensaje de entrada utilizando la función de utilidad cniSetInputBuffer. Por ejemplo:
{
  static char* functionName = (char *)"_Input_run()";
  void*        buffer;
  CciTerminal* terminalObject;
  int          buflen = 4096;
  int          rc = CCI_SUCCESS;
  int          rcDispatch = CCI_SUCCESS;
  
  buffer = readFromDevice(&buflen);
  cniSetInputBuffer(&rc, message, buffer, buflen);
}
/*propagar etc*/

Control del trabajo con hebras y de las transacciones

Un nodo de entrada debe realizar el proceso apropiado de fin de mensaje cuando se ha propagado un mensaje a través de un flujo de mensajes. Específicamente, el nodo de entrada necesita hacer que se confirmen o se restituyan las transacciones y devolver las hebras a la agrupación de hebras.

Cada hebra de flujo de mensajes se asigna de una agrupación de hebras que se mantiene para cada flujo de mensajes e inicia la ejecución en la función cniRun. Determine el comportamiento de una hebra utilizando la función de utilidad cniDispatchThread, junto con el valor de retorno apropiado.

En la función cniRun, puede llamar a la función de utilidad cniDispatchThread para que otra hebra inicie la ejecución de la función cniRun. El momento más adecuado para ejecutar otra hebra es directamente después de haber establecido que pueden haber datos disponibles para que la función procese la nueva hebra.

El término transacción se utiliza de forma genérica para describir una transacción coordinada globalmente o una transacción controlada por el intermediario. Las transacciones coordinadas globalmente las coordina WebSphere MQ como gestor de transacciones que se ajusta a las normas de XA o el Servicio de recuperación de recursos (RRS) en z/OS. WebSphere Message Broker controla las transacciones confirmando (o restituyendo) los recursos de base de datos y, a continuación, confirmando las unidades de trabajo de WebSphere MQ. Sin embargo, si se utiliza un nodo definido por el usuario, el intermediario no puede confirmar automáticamente las actualizaciones de recursos. El nodo definido por el usuario utiliza valores de retorno para indicar si una transacción se ha ejecutado satisfactoriamente y controlar si las transacciones se han confirmado o restituido. La infraestructura de intermediario detecta las excepciones no manejadas y retrotrae la transacción.

La tabla siguiente describe cada uno de los valores de retorno soportados, el efecto que tiene cada uno en las transacciones y lo que hace el intermediario con la hebra actual.

Valor de retorno Efecto en la transacción Acción de intermediario en la hebra
CCI_SUCCESS_CONTINUE Confirmar Invoca la misma hebra otra vez en la función cniRun.
CCI_SUCCESS_RETURN Confirmar Devuelve la hebra a la agrupación de hebras.
CCI_FAILURE_CONTINUE Retrotraer Invoca la misma hebra otra vez en la función cniRun.
CCI_FAILURE_RETURN Retrotraer Devuelve la hebra a la agrupación de hebras.
CCI_TIMEOUT No aplicable. La función excede el tiempo de espera periódicamente mientras espera un mensaje de entrada. Invoca la misma hebra otra vez en la función cniRun.
El código siguiente es un ejemplo de utilización del código de retorno SUCCESS_RETURN con la función cniDispatchThread:
{
  ...
  cniDispatchThread(&rcDispatch, ((NODE_CONTEXT_ST *)context)->nodeObject);
  ...
  if (rcDispatch == CCI_NO_THREADS_AVAILABLE) return CCI_SUCCESS_CONTINUE;  
  else return CCI_SUCCESS_RETURN;
}     

Propagación del mensaje

Antes de propagar el mensaje, decida qué datos de flujo de mensaje desea propagar y qué terminal debe recibir los datos.

El objeto de terminal (terminalObject) se deriva de una lista que mantiene el nodo definido por el usuario.

Por ejemplo, para propagar el mensaje al terminal de salida, utilice la función cniPropagate:
  if (terminalObject) {
    if (cniIsTerminalAttached(&rc, terminalObject)) {
      if (rc == CCI_SUCCESS) {
        cniPropagate(&rc, terminalObject, localEnvironment, exceptionList, message);
      }
    }

En el ejemplo anterior, se utiliza la función cniIsTerminalAttached para probar si se puede propagar el mensaje al terminal especificado. Si no utiliza la función cniIsTerminalAttached y el terminal no está conectado a otro nodo por un conector, el mensaje no se propaga y no se devuelve ningún mensaje de aviso. Utilice la función cniIsTerminalAttached para evitar que se produzca este error.

Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión

Copyright IBM Corporation 1999, 2009Copyright IBM Corporation 1999, 2009.
Última actualización : 2009-02-16 13:56:21

as24988_