Timeout Control ノードと Timeout Notification ノードが同じ ID を持つように構成することによって、両者は関連付けられます。ControlledTimeout サンプルは、複数の Timeout Control ノードを 1 つの Timeout Notification ノードに関連付けることができることを示しています。つまり、1 つの Timeout Control ノードで処理されるタイムアウト要求を、同じ Timeout Notification ノードと関連付けられた他の Timeout Control ノードのいずれかを使用して、更新またはキャンセルできるということです。この点を試してみてください。最も簡単な方法は、取り消しエンキュー・ファイルを編集して、他の入力キューに書き出されるようにし、こうして他のノードで処理されるようにすることです。また、より高度な方法として、タイムアウト要求の <AllowOverwrite> フィールドを TRUE に変更することもできます。これにより Timeout Control ノードは、現在実行中のタイムアウト要求を廃棄して、新しく着信した要求を実行します (タイムアウト要求自体の <Identifier> タグと一致する場合)。また、異なるタイムアウト ID を使用して新しいタイムアウト要求メッセージを作成し、複数の並行タイムアウトの処理をテストすることもできます。
このサンプルでは、タイムアウト要求はメッセージの本体に含まれています。タイムアウト要求はメッセージ・ツリー内のどこにでも渡すことができますが、構成時に特に指定されていない限り、Timeout Control ノードは LocalEnvironment でこれを探します。この動作を利用するには、以下の ESQL に示すとおり、Timeout Control ノードがこの情報を追加するより前のどこかの場所に、Compute ノードを追加しなければなりません。さらにこの ESQL では、タイムアウト ID を動的に設定して、競合しないようにする方法も示されています。
CREATE COMPUTE MODULE Timeout_Set
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
SET OutputRoot = InputRoot;
SET OutputLocalEnvironment.TimeoutRequest.Action = 'SET';
SET OutputLocalEnvironment.TimeoutRequest.Identifier = OutputRoot.XML.Data.UniqueId;
SET OutputLocalEnvironment.TimeoutRequest.StartDate = 'TODAY';
SET OutputLocalEnvironment.TimeoutRequest.StartTime = 'NOW';
SET OutputLocalEnvironment.TimeoutRequest.Count = 10;
SET OutputLocalEnvironment.TimeoutRequest.Interval = 5;
RETURN TRUE;
END;
END MODULE;
Compute ノードを「メッセージと LocalEnvironment を渡す」に設定するのを忘れないようにしてください。その後、Timeout Control ノードの「要求ロケーション」がデフォルト値から変更されている場合は、これをブランクにする必要があります。
最後に、以下の ESQL では、相対的な時間を生成することにより、60 秒間のタイムアウトが将来 1 回だけ行われるように設定する方法を示しています。
CREATE COMPUTE MODULE UT_CONTROL_TIMEOUT_10
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
SET OutputRoot = InputRoot;
DECLARE jump INTERVAL;
SET jump = INTERVAL '60' SECOND;
DECLARE start TIME;
SET start = CURRENT_TIME + jump;
SET OutputLocalEnvironment.TimeoutRequest.Action = 'SET';
SET OutputLocalEnvironment.TimeoutRequest.Identifier = 'control';
SET OutputLocalEnvironment.TimeoutRequest.StartDate = 'TODAY';
SET OutputLocalEnvironment.TimeoutRequest.StartTime = start;
RETURN TRUE;
END;
END MODULE;