Estendendo o Recurso de um Nó Input C

Antes de começar

Certifique-se de que tenha lido e entendido o seguinte tópico:
Depois de criar um nó definido pelo usuário, as seguintes opções estarão disponíveis:
  1. Recebendo Dados Externos em um Buffer
  2. Controlando Encadeamentos e Transações
  3. Propagando a Mensagem

Recebendo Dados Externos em um Buffer

Um nó input pode receber dados de qualquer tipo de origem externa, tal como um sistema de arquivos ou conexões FTP, desde que a saída do nó esteja no formato correto. Para conexões a filas ou bancos de dados, devem-se utilizar os nós primitivos da IBM e as chamadas de API fornecidas, principalmente porque os nós primitivos já estão configurados para tratamento de erros. Não utilize os comandos mqget ou mqput para acesso direto às filas do WebSphere MQ.

Você deve fornecer um buffer de entrada (ou fluxo de bits) para conter os dados de entrada e o associar a um objeto de mensagem. Na API C, o buffer é conectado ao objeto CciMessage que representa a mensagem de entrada, utilizando a função do utilitário cniSetInputBuffer. Exemplo:
{
    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);
}
/*propagate etc*/

Controlando Encadeamentos e Transações

Um nó input tem uma responsabilidade de executar o processamento apropriado de final de mensagem quando uma mensagem tiver sido propagada através de um fluxo de mensagens. Especificamente, o nó de entrada precisa fazer com que qualquer transação seja consolidada ou retornada e retornar os encadeamentos ao conjunto de encadeamentos.

Cada encadeamento do fluxo de mensagens é alocado de um conjunto de encadeamentos mantido para cada fluxo de mensagens, e inicia a execução na função cniRun. O comportamento de um encadeamento é determinado utilizando-se a função do utilitário cniDispatchThread juntamente com o valor de retorno apropriado.

A partir da função cniRun você pode chamar o utilitário cniDispatchThread para provocar outro encadeamento para iniciar a execução da função cniRun. O momento mais apropriado para se executar outro encadeamento é diretamente depois que você tiver estabelecido que poderiam haver dados disponíveis para que a função fosse processada no novo encadeamento.

O termo transaction é utilizado genericamente aqui, para descrever uma transação coordenada globalmente ou uma transação controlada pelo intermediário.As transações coordenadas globalmente são coordenadas pelo WebSphere MQ como um Gerenciador de Transação compatível com XA, ou pelo RMS (Resource Recovery Service) no z/OS . O WebSphere Message Broker controla as transações através da consolidação (ou retorno) de quaisquer recursos do banco de dados e, em seguida, consolidando quaisquer unidades de trabalho do WebSphere MQ, porém, se for utilizado um nó definido pelo usuário, não será possível ao servidor intermediário fazer automaticamente a consolidação de nenhuma atualização de recurso. O nó definido pelo usuário utiliza valores de retorno para indicar se uma transação obteve êxito, e para controlar se as transações foram consolidadas ou retornadas. Quaisquer exceções não tratadas são capturadas pela infra-estrutura do intermediário e a transação é revertida.

A tabela a seguir descreve cada um dos valores de retorno suportados, o efeito que cada um deles tem em qualquer transação e o que o intermediário faz com o encadeamento atual.

Valor de Retorno Efeito na Transação Ação do Intermediário no Encadeamento
CCI_SUCCESS_CONTINUE consolidado Chama o mesmo encadeamento novamente na função cniRun.
CCI_SUCCESS_RETURN consolidado Retorna o encadeamento para o conjunto de encadeamentos.
CCI_FAILURE_CONTINUE retornado Chama o mesmo encadeamento novamente na função cniRun.
CCI_FAILURE_RETURN retornado Retorna o encadeamento para o conjunto de encadeamentos.
CCI_TIMEOUT Não aplicável. A função periodicamente atinge o tempo limite enquanto aguarda por uma mensagem de entrada. Chama o mesmo encadeamento novamente na função cniRun.
O exemplo a seguir mostra a utilização do código de retorno SUCCESS_RETURN com a função cniDispatchThread:
{
  ...
  cniDispatchThread(&rcDispatch, ((NODE_CONTEXT_ST
*)context)->nodeObject);  ...
    if (rcDispatch == CCI_NO_THREADS_AVAILABLE) return CCI_SUCCESS_CONTINUE;  
    else return CCI_SUCCESS_RETURN;
}     

Propagando a Mensagem

Antes de propagar uma mensagem, você precisa decidir que dados do fluxo de mensagens deseja propagar, e que terminal deve receber os dados.

O terminalObject é derivado de uma lista que o próprio nó definido pelo usuário mantém.

Por exemplo, para propagar a mensagem para o terminal de saída, você utiliza a função cniPropagate:
  if (terminalObject) {
        if (cniIsTerminalAttached(&rc, terminalObject)) {
            if (rc == CCI_SUCCESS) {
                cniPropagate(&rc, terminalObject, destinationList, exceptionList, message);
      }
    }

No exemplo acima, a função cniIsTerminalAttached é utilizada para testar se a mensagem pode ser propagada para o terminal especificado. Se você não utilizar a função cniIsTerminalAttached e o terminal não estiver anexado a outro nó por um conector, a mensagem não será propagada e nenhuma mensagem de aviso será retornada. Utilize a função cniIsTerminalAttached para impedir que isso ocorra.

Avisos | Marcas Registradas | Downloads | Biblioteca | Suporte | Feedback
Direitos Autorais IBM Corporation 1999, 2006 Última Atualização: 1 Sep 2006
as24988_