WebSphere Message Broker, Versión 8.0.0.5 Sistemas operativos: AIX, HP-Itanium, Linux, Solaris, Windows, z/OS

Consulte la información sobre la última versión del producto en IBM Integration Bus, Versión 9.0

cciRegisterForThreadStateChange

Esta función registra una función a la que se debe llamar cuando la hebra actual entra en un estado específico.

Sintaxis

void cciRegisterForThreadStateChange(
          int               *returnCode,
          CciThreadContext  *threadContext,
          CciDataContext    *userContext,
          CciRegCallback     callback,
          CciCallbackType    type);

Parámetros

returnCode
Código de retorno de la función (salida). Un valor de entrada de NULL significa que los errores se manejan de forma silenciosa o que el intermediario hace caso omiso de ellos. Si el valor de entrada no es NULL, el valor de salida indica el estado de éxito de la llamada. Si el parámetro threadContext no es válido, *returnCode se establece en CCI_INV_THREAD_CONTEXT y la devolución de llamada no se registra.
threadContext
Este parámetro proporciona el contexto de hebra en el que registrar la función de devolución de llamada y los datos asociados. Se presupone que este parámetro se obtiene llamando a cniGetThreadContext() en la hebra actual. Si se proporciona NULL como threadContext, la infraestructura es la que determina el contexto de hebra. Este método no es tan eficaz como llamar a cniGetThreadContext.
userContext
Este parámetro permite al canal de llamada proporcionar un puntero de contexto que, cuando se llama, se pasa a la función de devolución de llamada. Este parámetro puede ser NULL.
callback
Este parámetro es un puntero a la función de devolución de llamada que se va a llamar. Esta función debe ser del tipo CciRegCallback.
type
Este parámetro especifica si la devolución de llamada debe invocarse cuando la hebra está finalizando o cuando la hebra está en uno de los estados de desocupado. Los estados de desocupado puede ser uno de los valores siguientes:
  • CCI_THREAD_STATE_IDLE:

    El nodo de entrada para la hebra actual está sondeando activamente datos del origen de entrada, pero no hay datos disponibles. Los mensajes no se propagan por el flujo de mensajes hasta que no hay datos disponibles para el nodo de entrada.

  • CCI_THREAD_STATE_INSTANCE_END

    El nodo de entrada para la hebra actual ha dejado de sondear datos y la hebra se ha liberado. La hebra es despachada de nuevo por el mismo nodo de entrada o por otro nodo de entrada del mismo flujo de mensajes. Se entra en este estado cuando se han configurado instancias adicionales, que se han desplegado para un flujo de mensajes, para hacer frente a un flujo de datos de entrada que ahora ya ha cesado. El nodo de entrada sigue sondeando datos de entrada en una sola hebra, y las otras hebras se liberan.

  • CCI_THREAD_STATE_TERMINATION

    La hebra actual está finalizando. Esta acción puede suceder cuando se cierra el intermediario, el proceso del grupo de ejecución finaliza de forma controlada, o cuando se suprime el flujo de mensajes. Esta condición puede ocurrir después de haber suprimido todos los nodos y analizadores del flujo.

De forma alternativa, el parámetro type puede ser el resultado de una operación OR bit a bit en dos o más de estos valores. En este caso, se llama a la función especificada cuando la hebra entra en el estado relevante para cada valor type específico.

Valores de retorno

Ninguno. Si se produce un error, el parámetro returnCode indica la razón del mismo.

Ejemplo

Declaración de la estructura y la función:

typedef struct {
    int         id;
}MyContext;

static int registered=0;

CciRegCallbackStatus switchThreadStateChange(
           CciDataContext *context, CciCallbackType type)
{
  char    traceText[256];
  char*   typeStr=0;
  MyContext* myContext = (MyContext*)context;

  if (type==CCI_THREAD_STATE_IDLE){
      typeStr = "idle";      
  }else if(type==CCI_THREAD_STATE_INSTANCE_END){
      typeStr = "instance end";
  }else if (type==CCI_THREAD_STATE_TERMINATION){
      typeStr = "termination";
  }else{
      typeStr = "unknown";
  }

  memset(traceText,0,256);
  sprintf(traceText,"switchThreadStateChange: context id = %d, thread state %s",myContext->id,typeStr);
  cciServiceTrace(NULL,
                  NULL,
                  traceText);
  return CCI_THREAD_STATE_REGISTRATION_RETAIN;

}

Coloque el código siguiente en la función _Switch_evaluate en los ejemplos para que pueda leer el rastreo de servicio y ver cuándo la hebra de proceso de mensaje cambia de estado:

/*registrar para cambio de estado de hebra */
  CciMessageContext* messageContext = cniGetMessageContext(NULL,message);
  CciThreadContext*  threadContext  = cniGetThreadContext(NULL,messageContext);
  
  static MyContext myContext={1};  

  if(registered==0){
    cciRegisterForThreadStateChange(
                   NULL,
                   threadContext,
                   & myContext,
                   switchThreadStateChange,
                   CCI_THREAD_STATE_IDLE | 
                   CCI_THREAD_STATE_INSTANCE_END |
                   CCI_THREAD_STATE_TERMINATION);
  registered=1;
  
  }

Este ejemplo sólo registra en la primera hebra que recibe un mensaje. Si es necesario registrar cada hebra que recibe un mensaje, las extensiones definidas por el usuario deben recordar en qué hebras se han registrado.

Al utilizar el parámetro userContext, puede ver cómo los datos se pasan del código en el que está registrada la devolución de llamada a la función de devolución de llamada real.

Al registrar la devolución de llamada, se pasa un puntero a una instancia de la estructura MyContext. Este puntero es el mismo puntero que se devuelve a la devolución de llamada. Para asegurar que el puntero todavía es válido cuando se devuelve a la devolución de llamada, una instancia de la estructura se declara como estática. Otra técnica para asegurar que el puntero es válido es asignar almacenamiento en el almacenamiento dinámico.

En la función de devolución de llamada, el parámetro userContext puede transformarse en un (MyContext*). Se puede hacer referencia a la estructura de MyContext original a través de esta dirección. Esta técnica permite el paso de datos del código donde está registrada la devolución de llamada a la función de devolución de llamada.

Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Comentarios

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

        
        Última actualización:
        
        Última actualización: 2015-02-28 17:00:29


Tema de referenciaTema de referencia | Versión 8.0.0.5 | as24630_