Estendendo o Recurso de um Nó Input C

Quando você tiver criado um nó definido pelo usuário, poderá estender sua capacidade.

Antes de começar

Leia Criando um Nó Input em C.

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ó de entrada pode receber dados de qualquer tipo de origem externa, como um sistema de arquivos ou conexão FTP, desde que a saída do nó esteja no formato correto. Para conexões com filas ou bancos de dados, utilize os nós integrados e as chamadas de API fornecidas, principalmente porque os nós integrados já estão configurados para manipulação de erros. Não utilize as chamadas 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 de 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ó de entrada deve executar processamento de fim de mensagem apropriado 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. Você determina o comportamento de um encadeamento utilizando a função de utilitário cniDispatchThread juntamente com o valor de retorno apropriado.

Na função cniRun, você pode chamar a função de 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 de estabelecer que dados poderiam estar disponíveis para que a função seja processada no novo encadeamento.

O termo transaction é utilizado genericamente 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 RRS (Resource Recovery Service) no z/OS. .O WebSphere Message Broker controla as transações confirmando (ou recuperando) quaisquer recursos do banco de dados e, em seguida, confirmando quaisquer unidades de trabalho do WebSphere MQ. Entretanto, se um nó definido pelo usuário for utilizado, o intermediário não poderá confirmar automaticamente 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. A infra-estrutura do intermediário captura qualquer exceção não-manipulada e recupera a transação.

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 Confirmada Chama o mesmo encadeamento novamente na função cniRun.
CCI_SUCCESS_RETURN Confirmada Retorna o encadeamento para o conjunto de encadeamentos.
CCI_FAILURE_CONTINUE Recuperada Chama o mesmo encadeamento novamente na função cniRun.
CCI_FAILURE_RETURN Recuperada Retorna o encadeamento para o conjunto de encadeamentos.
CCI_TIMEOUT Não aplicável. A função periodicamente atinge o tempo limite enquanto está aguardando por uma mensagem de entrada. Chama o mesmo encadeamento novamente na função cniRun.
O código a seguir é um exemplo de uso 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, utilize a função cniPropagate:
  if (terminalObject) {
        if (cniIsTerminalAttached(&rc, terminalObject)) {
            if (rc == CCI_SUCCESS) {
        cniPropagate(&rc, terminalObject, localEnvironment, 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 esse erro ocorra.

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

Copyright IBM Corporation 1999, 2009Copyright IBM Corporation 1999, 2009.
Última atualização : 2009-02-13 16:13:13

as24988_