Crie um nó de entrada definido pelo usuário em C para receber mensagens em um fluxo de mensagens.
Uma biblioteca de implementação carregável, ou uma LIL, é o módulo de implementação para um nó em C. Uma LIL é implementada como uma DLL (Biblioteca de Links Dinâmicos) ou biblioteca compartilhada, mas tem a extensão de arquivo .lil, não .dll.
As funções de implementação gravadas para o nó são listadas em Funções de Implementação de Nó C. Você pode chamar as funções de utilitário, implementadas no intermediário de tempo de execução, para ajudar na operação do nó; essas funções são listadas em Funções de Utilitários de Nó C.
O WebSphere Message Broker fornece a origem para dois nós de amostra definidos pelo usuário chamados SwitchNode e TransformNode. Você pode utilizar esses nós em seus estados atuais ou poderá modificá-los.
Para declarar e definir um nó definido pelo usuário para o intermediário, inclua uma função de inicialização, bipGetMessageflowNodeFactory, na LIL. As seguintes etapas descrevem como o intermediário chama a função de inicialização e como sua função de inicialização declara e define o nó definido pelo usuário:
Os atributos são definidos sempre que se inicia o intermediário, ou quando se reimplementa o fluxo de mensagens com novos valores.
{ const CciChar* ucsAttr = CciString("nodeTraceSetting", BIP_DEF_COMP_CCSID) ; insAttrTblEntry(p, (CciChar*)ucsAttr, CNI_TYPE_INTEGER); _setAttribute(p, (CciChar*)ucsAttr, (CciChar*)constZero); free((void *)ucsAttr) ; } { const CciChar* ucsAttr = CciString("nodeTraceOutfile", BIP_DEF_COMP_CCSID) ; insAttrTblEntry(p, (CciChar*)ucsAttr, CNI_TYPE_STRING); _setAttribute(p, (CciChar*)ucsAttr, (CciChar*)constSwitchTraceLocation); free((void *)ucsAttr) ; }
Quando o intermediário percebe que possui um nó input, ele chama a função cniRun desse nó a intervalos regulares. A função cniRun deve então decidir que curso de ação tomar. Se os dados estiverem disponíveis para processamento, a função cniRun deverá tentar propagar a mensagem. Se não houver dados disponíveis para processamento, a função cniRun deverá retornar com CCI_TIMEOUT para que o intermediário possa continuar as alterações na configuração.
If ( anything to do ) CniDispatchThread; /* fazer o trabalho */ If ( work done O.K.) Return CCI_SUCCESS_CONTINUE; Else Return CCI_FAILURE_CONTINUE; Else Return CCI_TIMEOUT;
Uma implementação de nó de entrada geralmente determina que o analisador de mensagem examina inicialmente uma mensagem de entrada. Por exemplo, o nó MQInput primitivo dita que um analisador de MQMD é necessário para analisar o cabeçalho MQMD. Um nó de entrada definido pelo usuário pode selecionar um analisador de cabeçalho ou de mensagem apropriado, e o modo no qual a análise é controlada, utilizando ou substituindo os seguintes atributos que são incluídos como padrão:
CciFactory LilFactoryExportPrefix * LilFactoryExportSuffix bipGetMessageflowNodeFactory() { .... CciFactory* factoryObject; .... factoryObject = cniCreateNodeFactory(0, (unsigned short *)constPluginNodeFactory); ... vftable.iFpCreateNodeContext = _createNodeContext; vftable.iFpSetAttribute = _setAttribute; vftable.iFpGetAttribute = _getAttribute; ... cniDefineNodeClass(&rc, factoryObject, (CciChar*)constSwitchNode, &vftable); ... return(factoryObject); }
CciContext* _createNodeContext( CciFactory* factoryObject, CciChar* nodeName, CciNode* nodeObject ){ NODE_CONTEXT_ST* p; ... /* Alocar um ponteiro para o contexto local */ p = (NODE_CONTEXT_ST *)malloc(sizeof(NODE_CONTEXT_ST)); /* Criar atributos e definir valores padrão */ { const CciChar* ucsAttrName = CciString("firstParserClassName", BIP_DEF_COMP_CCSID) ; const CciChar* ucsAttrValue = CciString("MYPARSER", BIP_DEF_COMP_CCSID) ; insAttrTblEntry(p, (CciChar*)ucsAttrName, CNI_TYPE_INTEGER); /*consulte a amostra BipSampPluginNode.c para a implementação de insAttrTblEntry*/ _setAttribute(p, (CciChar*)ucsAttrName, (CciChar*)ucsAttrValue); free((void *)ucsAttrName) ; free((void *)ucsAttrValue) ; }No exemplo de código acima, o método insAttrTblEntry é chamado. Esse método é declarado nos nós definidos pelo usuário de amostra SwitchNode e TransformNode.
Os nós são destruídos quando um fluxo de mensagens é reimplementado ou quando o processo do grupo de execução é parado (utilizando o comando mqsistop). Quando um nó é destruído, ele deve chamar a função cniDeleteNodeContext para liberar qualquer memória utilizada e quaisquer recursos retidos. Por exemplo:
void _deleteNodeContext( CciContext* context ){ static char* functionName = (char *)"_deleteNodeContext()"; return; }