本主题中的信息适用于输出节点和消息处理节点。这两种节点类型可以视为一体,这是因为尽管消息处理节点通常用于处理消息,而输出节点用于提供位流格式的输出,但是您可以使用这两个节点类型中的任何一个来执行这两种功能中的任何一种。
操作系统装入并初始化包含节点的 LIL 后,用户定义的消息处理节点向代理进行注册。
代理调用 bipGetMessageflowNodeFactory 来确定 LIL 的函数及如何调用 LIL。
bipGetMessageflowNodeFactory 函数又调用 cniCreateNodeFactory 函数,该函数为 LIL 支持的所有节点返回工厂或组名。
然后,LIL 应该调用实用程序函数 cniDefineNodeClass,以传递每个节点的名称和实施函数的函数指针的虚函数表。
在实例化阶段,将创建用户定义的消息处理节点的实例。当代理创建消息流并为该消息流中用户定义节点的每个实例化调用 cniCreateNodeContext 函数时,该阶段开始。cniCreateNodeContext 函数是在 CNI_VFT 结构的 iFpCreateNodeContext 字段中指定的函数,该 CNI_VFT 结构被传递到该节点类型的 cniDefineNodeClass。此函数应该为该节点分配所需的资源(包括内存),这样用户定义节点的实例化就可以保留已配置属性的值。
在 cniCreateContext 内,用户定义的扩展调用两个函数 cniCreateInputTerminal 和 cniCreateOutputTerminal,来确定消息处理节点所具有的输入和输出终端。
在用户定义的消息处理节点生命周期的处理阶段,当在输入消息上进行一些处理操作时,会以某些方式转换消息。
当代理从队列检索消息并且该消息到达用户定义节点的输入终端时,代理调用实施函数 cniEvaluate。此函数用于确定对消息进行什么处理。
您可以在用户定义的消息处理节点中使用一系列的节点实用程序函数来执行一系列的消息处理函数,例如,访问消息数据、访问 ESQL、转换消息对象和传播消息。您应该将要用于处理消息的节点实用程序函数包含在 cniEvaluate 函数内。
此接口不为消息自动生成属性子树。不要求消息一定要具有属性子树,尽管您可能会发现创建一个 properties 子树对于提供一致的消息树结构(不考虑输入节点)十分有用。如果您要在消息中创建属性子树,并且还使用用户定义的输入节点,则必须自行执行此操作。
用户定义的消息处理节点已经对消息进行处理之后,您应该确保它已被破坏,来释放它使用的任何系统资源,并释放任何特定于节点实例的数据区,例如,当构造或处理消息时获取的上下文。
当代理调用 cniDeleteNodeContext 函数时,将破坏用户定义的消息处理节点的实例。