メッセージ処理ノードは何らかの形でメッセージを処理するために使用され、出力ノードはメッセージをビット・ストリームとして出力するために使用されます。
メッセージ処理ノードまたは出力ノードをコーディングする場合、ノードは基本的に同じサービスを提供します。出力ノードでメッセージ処理を実行することもできますし、メッセージ処理ノードを使用してメッセージをビット・ストリームとして出力することもできます。 このトピックでは、簡略化のために主にメッセージ処理ノードを指して「ノード」という語を使用していますが、両方のタイプのノードの機能に関する情報も取り上げています。
ロード可能インプリメンテーション・ライブラリー (LIL) は、C ノードのインプリメンテーション・モジュールです。 LIL は共用ライブラリーまたはダイナミック・リンク・ライブラリー (DLL) としてインプリメントされますが、ファイル拡張子は .dll ではなく .lil です。
ノード用に作成する C ノード・インプリメンテーション関数の詳細については、C ノード・インプリメンテーション関数を参照してください。ランタイム・ブローカーにインプリメントされた C ノード・ユーティリティー関数を呼び出して、ノード操作に役立てることもできます。C ノード・ユーティリティー関数を参照してください。
ブローカーに対してユーザー定義ノードを宣言して定義するには、初期化関数 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) ; }
ブローカーがキューからメッセージを取り出し、 そのメッセージがユーザー定義のメッセージ処理ノードまたは出力ノードの入力ターミナルに到着すると、 ブローカーはインプリメンテーション関数 cniEvaluate を呼び出します。 この関数はメッセージ処理スレッド上に呼び出され、メッセージを使用して何を行うかを決定します。 特に追加のインスタンスが使用される場合に、この関数はマルチスレッド上に呼び出される場合もあります。
ノードが削除された場合には、ブローカーは cniDeleteNodeContext 関数を呼び出します。 この関数は、cniCreateNodeContext と同じスレッドで開始されます。 この関数を使用して、ユーザー定義ノードが使用していたすべてのリソースを解放します。 以下に例を示します。
void _deleteNodeContext( CciContext* context ){ static char* functionName = (char *)"_deleteNodeContext()"; free ((void*) context); return; }