可装入实现库或 LIL 是 C 节点(或解析器)的实现模块。LIL 实现为动态链接库(DLL)。它没有文件扩展名 .dll 但有文件扩展名 .lil。
必须由开发者写的实施函数在C 节点实施函数中列出。WebSphere Message Broker 提供的用于帮助此过程的实用程序函数在C 节点实用程序函数中列出。
WebSphere Message Broker 为称为 SwitchNode 和 TransformNode 的两个用户定义的样本节点提供了数据源。您可以使用当前状态下的这些节点,也可以修改这些节点。
要向代理声明定义用户定义的节点,必须将初始化函数 bipGetMessageflowNodeFactory 包含进您的 LIL。下列步骤简要说明了代理如何调用您的初始化函数,以及该初始化函数如何声明定义用户定义的节点:
每当您启动代理时或当您使用新的值重新部署消息流时,将设置属性。
{ 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) ; }
当代理知道它有一个输入节点时,它按固定时间间隔调用此节点的 cniRun 函数。然后,cniRun 函数必须确定它应该采取什么操作。如果可以处理数据,则 cniRun 函数应该尝试传播消息。如果不能处理数据,则 cniRun 函数应该返回 CCI_TIMEOUT,这样代理可以继续更改配置。
If ( anything to do ) CniDispatchThread; /* do the work */ If ( work done O.K.) Return CCI_SUCCESS_CONTINUE; Else Return CCI_FAILURE_CONTINUE; Else Return CCI_TIMEOUT;
输入节点实现通常确定什么消息解析器在开始的时候解析输入消息。例如,原语 MQInput 节点规定需要 MQMD 解析器解析 MQMD 头。用户定义的输入节点可以通过使用缺省包含的下列属性(您可以覆盖它们)选择合适的头或消息解析器:
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; ... /* Allocate a pointer to the local context */ p = (NODE_CONTEXT_ST *)malloc(sizeof(NODE_CONTEXT_ST)); /* Create attributes and set default values */ { 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); /*see sample BipSampPluginNode.c for implementation of insAttrTblEntry*/ _setAttribute(p, (CciChar*)ucsAttrName, (CciChar*)ucsAttrValue); free((void *)ucsAttrName) ; free((void *)ucsAttrValue) ; }在上面的实例代码中,insAttrTblEntry 方法被调用。此方法在用户定义的样本节点中声明。