Antes de começar
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.
{ 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*/
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. |
{ ... cniDispatchThread(&rcDispatch, ((NODE_CONTEXT_ST *)context)->nodeObject); ... if (rcDispatch == CCI_NO_THREADS_AVAILABLE) return CCI_SUCCESS_CONTINUE; else return CCI_SUCCESS_RETURN; }
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.
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.