メッセージ処理ノードおよびパーサーは、 マルチインスタンス、マルチスレッド化環境で作業することが必要です。 それぞれがいくつかの構文エレメントを持つ、多くのノード・オブジェクトまたはパーサー・オブジェクトが使用でき、これらのオブジェクト上で多くのスレッドはメソッドを実行できます。
メッセージ・フロー処理ノードのインスタンスは、 ノードが定義されるメッセージ・フローを保守するすべてのスレッドによって共有および使用されます。 パーサーはノードと同じスレッド上で呼び出されるため、フローが複数のスレッドを使用している場合は、パーサーも複数のスレッドを使用します。
ユーザー定義の拡張機能はこのモデルを使用する必要があります。ユーザー定義のノードがグローバル・データやリソースを必要とする場合は、スレッド間でアクセスを逐次化するセマフォーを使用してグローバル・データやリソースを保護する必要があります。しかし、そのような逐次化は、パフォーマンスのボトルネックの原因となることがあります。よりスケーラブルなソリューションを作成するには、グローバル・データおよびリソースの使用を避けてください。
ユーザー定義拡張機能によってインプリメントされた関数は再入可能でなければならず、 それらが呼び出すその他の関数も再入可能であることが必要です。すべてのユーザー定義拡張機能のユーティリティー関数は、完全に再入可能です。
ユーザー定義拡張機能では必要に応じて追加のスレッドを作成できるものの、すべての C ユーティリティー関数および Java™ メソッドは、C では cniEvaluate 関数、Java では evaluate メソッド (ノードが書かれた言語に準ずる) を呼び出した同一のスレッド上で呼び出される必要があります。 同じスレッドが使用されないと、ご使用のコードがブローカーの保全性を損なって、予測不能な動作を引き起こす原因になる可能性があります。追加のスレッドではユーザー定義拡張機能の API を呼び出さないでください。API は、ブローカーによって呼び出されたメインのスレッドからのみ使用してください。
cniEvaluate 関数について詳しくは、cniEvaluateを参照してください。