Cree un nodo de entrada definido por el usuario en C para recibir mensajes en un flujo de mensajes.
Una biblioteca de implementación cargable, o LIL, es el módulo de implementación para un nodo en C. Una LIL se implementa como una biblioteca de enlaces dinámicos (DLL) o compartidos, pero tiene la extensión .lil, no .dll.
Las funciones de implementación que escribe para el nodo se listan en Funciones de implementación de nodo en C. Puede llamar a funciones de utilidad, implementadas en el intermediario de ejecución, como ayuda para el funcionamiento del nodo; estas funciones se listan en Funciones de utilidad de nodo en C.
WebSphere Message Broker proporciona el origen de dos nodos definidos por el usuario de ejemplo denominados SwitchNode y TransformNode. Puede utilizar estos nodos en su estado actual o puede modificarlos.
Para declarar y definir un nodo definido por el usuario en el intermediario, incluya una función de inicialización bipGetMessageflowNodeFactory, en su LIL. Los pasos siguientes indican cómo llama el intermediario a su función de inicialización y cómo esa función declara y define el nodo definido por el usuario:
Para crear una instancia del nodo:
Se establecen atributos siempre que se inicia el intermediario o cuando se vuelve a desplegar el flujo de mensajes con valores nuevos.
{
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) ;
}
Cuando el intermediario sabe que tiene un nodo de entrada, invoca la función cniRun de este nodo a intervalos regulares. Entonces la función cniRun debe decidir qué acción debe realizar. Si hay datos disponibles para procesar, la función cniRun puede propagar el mensaje. Si no hay datos disponibles para procesar, la función cniRun debe volver con CCI_TIMEOUT de modo que el intermediario pueda continuar realizando cambios de configuración.
If ( algo para hacer )
CniDispatchThread;
/* realizar el trabajo */
If ( trabajo realizado satisfactoriamente)
Return CCI_SUCCESS_CONTINUE;
Else
Return CCI_FAILURE_CONTINUE;
Else
Return CCI_TIMEOUT;
Normalmente, una implementación de nodo de entrada determina qué analizador de mensajes analiza inicialmente un mensaje de entrada. Por ejemplo, el nodo MQInput indica que se necesita un analizador MQMD para analizar la cabecera MQMD. Un nodo de entrada definido por el usuario puede seleccionar un analizador de mensajes o cabeceras apropiado y la modalidad en la que se controla el análisis, utilizando o modificando los atributos siguiente que se incluyen como valores predeterminados:
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;
...
/* Asignar un puntero al contexto local */
p = (NODE_CONTEXT_ST *)malloc(sizeof(NODE_CONTEXT_ST));
/* Crear atributos y establecer valores predeterminados */
{
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);
/*ver BipSampPluginNode.c de ejemplo para la implementación de insAttrTblEntry*/
_setAttribute(p, (CciChar*)ucsAttrName, (CciChar*)ucsAttrValue);
free((void *)ucsAttrName) ;
free((void *)ucsAttrValue) ;
}
En el ejemplo de código anterior, se llama al método
insAttrTblEntry. Este método se declara en los nodos de ejemplo definidos por el usuario
SwitchNode y TransformNode.Los nodos se destruyen cuando se vuelve a desplegar un flujo de mensajes o cuando se detiene el proceso de grupo de ejecución (utilizando el mandato mqsistop). Cuando un nodo se destruye, debe llamar a la función cniDeleteNodeContext para liberar toda la memoria utilizada y todos los recursos retenidos. Por ejemplo:
void _deleteNodeContext(
CciContext* context
){
static char* functionName = (char *)"_deleteNodeContext()";
return;
}