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:
Para instanciar seu nó:
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 qual curso de ação deve ser tomado. Se os dados estiverem disponíveis para processamento, a função cniRun poderá propagar a mensagem. Se nenhum dado estiver disponível para processamento, a função cniRun deverá retornar com CCI_TIMEOUT para que o broker possa continuar as mudanças 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 dita que um analisador 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, é necessário chamar a função cniDeleteNodeContext para liberar toda memória usada e liberar todos os recursos mantidos. Por exemplo:
void _deleteNodeContext(
CciContext* context
){
static char* functionName = (char *)"_deleteNodeContext()";
return;
}