使用 C 语言创建输入节点
使用 C 语言创建用户定义输入节点,以将消息接收到消息流中。
准备工作
关于此任务
可装入实施库或 LIL 是 C 节点的实施模块。 LIL 当作共享或动态链接库(DLL)实现,但其文件扩展名为 .lil 而不是 .dll。
您为节点编写的实现函数在 C 节点实现函数中列出。 您可以调用在运行时集成节点中实现的实用程序函数,以帮助执行节点操作; 这些函数列示在 C 节点实用程序函数中。
IBM® App Connect Enterprise 提供了两个名为 SwitchNode 和 TransformNode 的用户自定义节点的源代码。 您可以使用当前状态下的这些节点,也可以修改这些节点。
声明和定义节点
关于此任务
要向集成节点声明和定义用户定义的节点,请在 LIL 中包含初始化函数 bipGetMessageflowNodeFactory。 下列步骤简要说明了集成节点如何调用您的初始化函数,以及该初始化函数如何声明和定义用户定义节点:
过程
创建节点实例
关于此任务
要实例化节点:
过程
设置属性
关于此任务
每当启动集成节点或使用新的值重新部署消息流时,将设置属性。
{
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) ;
}- label
- userTraceLevel
- traceLevel
- userTraceFilter
- traceFilter
实现节点功能
关于此任务
当集成节点知道它有输入节点时,它会定期调用此节点的 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); } - 设置 cniCreateNodeContext 实现函数中的属性:
在以上代码示例中,调用了 insAttrTblEntry 方法。 此方法在用户定义的 SwitchNode 和 TransformNode 样本节点中声明。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) ; }
删除节点实例
关于此任务
重新部署消息流或停止集成服务器进程 (使用 mqsistop 命令) 时,会破坏节点。 销毁节点时,必须调用 cniDeleteNodeContext 函数以释放所有使用的内存并释放所有挂起的资源。 例如:
void _deleteNodeContext(
CciContext* context
){
static char* functionName = (char *)"_deleteNodeContext()";
return;
}