WebSphere Message Broker, Versão 8.0.0.5 Sistemas operacionais: AIX, HP-Itanium, Linux, Solaris, Windows, z/OS

Consulte as informações sobre a versão mais recente do produto em IBM Integration Bus, Versão 9.0

cciRegisterForThreadStateChange

Essa função registra uma função a ser chamada quando o encadeamento atual informa um estado específico.

Sintaxe

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

Parâmetros

returnCode
O código de retorno da função (saída). Um valor de entrada igual a NULL significa que erros são tratados silenciosamente ou são ignorados pelo broker. Se o valor de entrada não for NULL, o valor de saída significa o status de sucesso da chamada. Se o parâmetro threadContext não for válido, *returnCode será configurado como CCI_INV_THREAD_CONTEXT e o retorno de chamada não será registrado.
threadContext
Este parâmetro fornece o contexto do encadeamento no qual registrar a função de retorno de chamada e os dados associados. É assumido que este parâmetro é obtido chamando cniGetThreadContext() no encadeamento atual. Se NULL for fornecido como threadContext, o contexto do encadeamento será determinado pela estrutura. Este método é menos eficiente do que chamar cniGetThreadContext.
userContext
Este parâmetro permite que o responsável pela chamada forneça um ponteiro de contexto que é transmitido para a função de retorno de chamada quando ela é chamada. Este parâmetro pode ser NULL.
callback
Este parâmetro é um ponteiro para a função de retorno de chamada que deve ser chamada. Esta função deve ser do tipo CciRegCallback.
type
Este parâmetro especifica se o retorno de chamada deve ser chamado no momento em que o encadeamento está encerrando ou quando o encadeamento está em um dos estados inativos. Os estados ociosos podem ter um dos seguintes valores:
  • CCI_THREAD_STATE_IDLE:

    O nó de entrada para o encadeamento atual está sondando ativamente em busca de dados da origem de entrada, mas nenhum dado está disponível. Mensagens não são propagadas através do fluxo de mensagens até os dados se tornarem disponíveis para o nó de entrada.

  • CCI_THREAD_STATE_INSTANCE_END

    O nó de entrada para o encadeamento atual parou o polling de dados e o encadeamento foi liberado. O encadeamento é despachado novamente pelo mesmo nó de entrada ou por outro nó de entrada no mesmo fluxo de mensagens. Este estado é inserido quando instâncias adicionais, que foram implementadas para um fluxo de mensagens, foram configuradas para competir com um influxo de dados de entrada que agora cessou. O nó de entrada continua sondando em busca de dados de entrada em um único encadeamento e os outros encadeamentos são liberados.

  • CCI_THREAD_STATE_TERMINATION

    O encadeamento atual é finalizado. Esta ação pode ocorrer quando o broker é encerrado, o processo do grupo de execução está encerrando de uma maneira controlada ou quando o fluxo de mensagens está sendo excluído. Este estado pode ocorrer após todos os nós e analisadores no fluxo serem excluídos.

Alternativamente, o parâmetro type pode ser o resultado de uma operação OR bit a bit em dois ou mais destes valores. Nesse caso, a função especificada é chamada quando o encadeamento informa o estado relevante para cada valor de type individual.

Valores de Retorno

Nenhum. Se ocorrer um erro, o parâmetro returnCode indica o motivo do erro.

Exemplo

Declarando a estrutura e a função:

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 o seguinte código na função _Switch_evaluate nas amostras para permitir que você leia o rastreio de serviço e veja quando o encadeamento do processamento de mensagens muda de estado:

/*registrar para alteração no estado de encadeamento*/
  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;
  
  }

Esse exemplo é registrado apenas no primeiro encadeamento que recebe uma mensagem. Se for necessário registrar cada encadeamento que recebe uma mensagem, as extensões definidas pelo usuário devem lembrar em quais encadeamentos elas foram registradas.

Usando o parâmetro userContext, é possível ver como os dados são transmitidos do código no qual o retorno de chamada é registrado para a função de retorno de chamada real.

Ao registrar o retorno de chamada, é transmitido um ponteiro para uma instância da estrutura MyContext. Este ponteiro é o mesmo ponteiro que é transmitido de volta ao retorno de chamada. Para assegurar que o ponteiro ainda é válido quando transmitido novamente para o retorno de chamada, uma instância da estrutura é declarada como estática. Outra técnica é assegurar que o ponteiro é válido para alocar o armazenamento no heap.

Na função de retorno de chamada, o parâmetro userContext pode ser convertido em um (MyContext*). A estrutura MyContext original pode ser referenciada através desse endereço. Esta técnica permite a transmissão de dados a partir do código no qual o retorno de chamada é registrado para a função de retorno de chamada.

Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback

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

        
        Última atualização:
        
        Última atualização: 2015-02-28 18:30:28


Tópico de ReferênciaTópico de Referência | Versão 8.0.0.5 | as24630_