この章では、トリガーと通知について説明します。次のトピックについて説明します。
ここでは、トリガーと通知という2つの概念について説明します。通知は、1つのオブジェクトから別のオブジェクトに送信されるメッセージで、何かが発生したことを受信者に通知します。通知の受信者はトリガーと呼ばれます。トリガーには、受信した1つまたは複数の通知に対して評価される条件が含まれています。指定された条件が満たされた場合、関連付けられたジョブが実行されます。
トリガーの条件は論理式で説明され、オペランドはジョブ通知アサーションです。通知は、次のいずれかの方法で生成できます。
アプリケーションによってプログラム的に生成
タイマーの有効期限切れの結果として生成
同様に、通知は特定のトリガーまたは指定されたトリガーのセットに送信できます。ただし、通知を受信したトリガーは通知を生成しません。トリガーを使用することで、アプリケーションの特定の条件にジョブを応答させることができます(特定のしきい値を超えた収益に基づいてジョブをトリガーするなど)。
システム提供のoracle.ias.scheduler.Trigger
クラスを使用して、関連付けられたジョブを実行する条件を指定します。条件はオペランドの論理的な組合せで表されます。次の論理演算子を使用できます。
AND(「&&」で表す)
OR(「||」で表す)
NOT(「!」で表す)
優先順位はカッコを使用して指定します。次に、式の例を示します。
N
通知Nを受け取ったときに実行します。
N1 || N2
どちらかの通知を受け取ったときに実行します。
N1 && N2
両方の通知を受け取ったときに実行します。
N1 || (N2 && N3)
通知N1を受け取るか、通知N2とN3の両方を受け取った場合に実行します。
条件のオペランドは、ジョブ・スケジューラのnotify()
メソッドを使用して送信された通知に関連付けられている名前です。たとえば、DataHasArrived
通知をすべてのトリガーに送信するには、次のコードを使用します。
Scheduler.notify(new Notification("DataHasArrived"));
ジョブ・スケジューラは、通知の送信時にトリガーを評価します。トリガーの評価の結果はブールです。トリガーがtrueと評価された場合、関連付けられたジョブが開始されます。トリガーの起動後、トリガーはジョブの実行前に即座にリセットされます。トリガーがリセットされると、トリガーが前に受信したすべての通知のレコードが消去されます。トリガーは、ジョブの実行時にのみリセットされます。トリガーが起動されない場合、通知は記録され、後で使用されます。
たとえば、トリガーに次の条件があるとします。
N1 && N2
トリガーが通知N1のみを受信した場合、トリガーはfalseと評価され、通知は記録されます。後でトリガーが通知N2を受信します。両方の条件が満たされたため、トリガーはtrueと評価され、トリガーはリセットされます。
ジョブはスケジュールまたはトリガー、あるいはスケジュールとトリガーの両方に関連付けることができます。ジョブをスケジュールのみに関連付けると、暗黙的なトリガーがジョブに関連付けられます。このタイプのトリガーには、次の条件があります。
timeout
スケジュールの有効期限が切れると、処理のためのtimeout通知が、関連付けられたトリガーに送信されます。この場合、トリガーが起動され、ジョブが実行されて、トリガーはリセットされます。timeout
通知は、他の通知とともにトリガー式でも使用できます。次に例を示します。
timeout || N
通知Nを受信するかスケジュールの有効期限切れのどちらかで実行します。
timeout && N
通知Nを受信し、スケジュールの有効期限が切れたら実行します。
timeout
通知は、ジョブがスケジュールとトリガーの両方に関連付けられている場合にのみ使用できます。timeout
通知名は予約され、アプリケーションで使用したり、スケジューラに送信することはできません。この動作は、Notificationクラスで一貫しています。さらに、timeout
通知は、トリガーの条件式で参照する必要があります。
トリガー式でNOT演算子を使用する場合は、次の点に注意してください。
NOT式には少なくとも2つの演算子が必要です。2つ以上の演算子を使用しないと、NOT条件以外のあらゆる通知を受信した場合にトリガーが起動されます。たとえば、式!N
を使用すると、N以外の通知を受信した場合にトリガーが起動されます。
NOT式は、無期限に繰り返されるスケジュールでは使用できません。このように使用すると、トリガーが永久にハングすることがあります。トリガーは、起動されるまで受信したすべての通知を保持することに注意してください。トリガーがNOT条件を満たす通知を受信しても、トリガーは決して起動されません。
トリガーを設定したジョブを発行するには、oracle.ias.scheduler.Trigger
クラスを使用します。詳細は、『Oracle Containers for J2EE Job Scheduler API Reference』を参照してください。
例8-1は、diskIsFull
通知の受信時にジョブを実行するトリガーの作成方法を示しています。
例8-1 トリガーを設定したジョブの発行
// set up the trigger, run when 'diskIsFull' notification is received Trigger trigger = new Trigger("diskIsFull"); // submit the job scheduler.add("disk is full job", diskFullJob.class.getName(), trigger, null);
例8-1を発展させて、例8-2は、diskIsFull
通知またはtimeout
通知を受信したときに、毎晩午前0時にジョブを実行するトリガーの作成方法を示しています。
例8-2 トリガーとスケジュールを設定したジョブの発行
// set up the schedule, repeats every night at midnight RecurSchedule schedule = new RecurSchedule("freq=daily,byhour=0;"); // set up the trigger, run when either 'diskIsFull' // notification is received or the schedule expires Trigger trigger = new Trigger("diskIsFull || timeout"); // submit the job scheduler.add("disk is full job", DiskFullJob.class.getName(), schedule, trigger, null, Level.WARN, 0L, 0L);
通知をジョブに送信するには、oracle.ias.scheduler.Scheduler.notify()
メソッドを使用します。詳細は、『Oracle Containers for J2EE Job Scheduler API Reference』を参照してください。
例8-3は、diskIsFull
通知をジョブに送信する方法を示しています。