ESQL を使用して 2 つのイベント間の時間間隔を計算し、指定された間隔後にタイマーがトリガーされるように設定することができます。
(CURRENT_ datetime 関数を呼び出すと、戻される値は同じノードの別の呼び出しに戻される値と同じです。 このため、単一ノード内では関数を一貫して使用できます。)
CALL CopyMessageHeaders();
Declare PutTime INTERVAL;
SET PutTime = (CURRENT_GMTTIME - InputRoot.MQMD.PutTime) MINUTE TO SECOND;
SET OutputRoot.XMLNS.Test.PutTime = PutTime;
出力メッセージの形式は、次のとおりです (実際の値は異なります)。
<Test>
<PutTime>INTERVAL '1:21.862' MINUTE TO SECOND</PutTime>
</Test>
以下のコード断片は、処理が完了したことを確認するために、処理の開始から指定インターバル後にトリガーされるようにタイマーを設定します。 例えば、経過時間内に処理が完了しなかった場合に、タイマーの起動によっていくつかのリカバリー処理をトリガーすることもできるかもしれません。
タイムアウト要求メッセージの StartTime フィールドは、現行時刻に許容遅延期間 (フローのユーザー定義プロパティーによって定義される) を加えたものに設定されます (ユーザー定義プロパティーは管理者によって、"HH:MM:SS" 形式のストリングに設定されます)。
DECLARE StartDelyIntervalStr EXTERNAL CHARACTER '01:15:05';
CREATE PROCEDURE ValidateTimeoutRequest() BEGIN
-- Set the timeout period
DECLARE timeoutStartTimeRef REFERENCE TO
OutputRoot.XMLNSC.Envelope.Header.TimeoutRequest.StartTime;
IF LASTMOVE(timeoutStartTimeRef)
THEN
-- Already set
ELSE
-- Set it from the UDP StartDelyIntervalStr
DECLARE startAtTime TIME CURRENT_TIME
+ CAST(StartDelyIntervalStr AS INTERVAL HOUR TO SECOND);
-- Convert "TIME 'hh.mm.ss.fff'" to hh.mm.ss format
-- needed in StartTime field
DECLARE startAtTimeStr CHAR;
SET startAtTimeStr = startAtTime;
SET startAtTimeStr = SUBSTRING(startAtTimeStr FROM 7 FOR 8);
SET OutputRoot.XMLNSC.Envelope.Header.TimeoutRequest.StartTime
= startAtTimeStr;
END IF;
END;