ヘッダーをスキップ
Oracle Containers for J2EEジョブ・スケジューラ開発者ガイド
10g(10.1.3.1.0)
B31853-01
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

8 Oracle Application Server Containers for J2EEのトリガーと通知

この章では、トリガーと通知について説明します。次のトピックについて説明します。

8.1 トリガードリブン・ジョブ

ここでは、トリガーと通知という2つの概念について説明します。通知は、1つのオブジェクトから別のオブジェクトに送信されるメッセージで、何かが発生したことを受信者に通知します。通知の受信者はトリガーと呼ばれます。トリガーには、受信した1つまたは複数の通知に対して評価される条件が含まれています。指定された条件が満たされた場合、関連付けられたジョブが実行されます。

トリガーの条件は論理式で説明され、オペランドはジョブ通知アサーションです。通知は、次のいずれかの方法で生成できます。

同様に、通知は特定のトリガーまたは指定されたトリガーのセットに送信できます。ただし、通知を受信したトリガーは通知を生成しません。トリガーを使用することで、アプリケーションの特定の条件にジョブを応答させることができます(特定のしきい値を超えた収益に基づいてジョブをトリガーするなど)。

8.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通知は、トリガーの条件式で参照する必要があります。

8.1.2 NOT演算子を使用する場合の注意

トリガー式でNOT演算子を使用する場合は、次の点に注意してください。

  • NOT式には少なくとも2つの演算子が必要です。2つ以上の演算子を使用しないと、NOT条件以外のあらゆる通知を受信した場合にトリガーが起動されます。たとえば、式!Nを使用すると、N以外の通知を受信した場合にトリガーが起動されます。

  • NOT式は、無期限に繰り返されるスケジュールでは使用できません。このように使用すると、トリガーが永久にハングすることがあります。トリガーは、起動されるまで受信したすべての通知を保持することに注意してください。トリガーがNOT条件を満たす通知を受信しても、トリガーは決して起動されません。

8.2 トリガーを設定したジョブの発行方法

トリガーを設定したジョブを発行するには、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);

8.3 ジョブへの通知の送信方法

通知をジョブに送信するには、oracle.ias.scheduler.Scheduler.notify()メソッドを使用します。詳細は、『Oracle Containers for J2EE Job Scheduler API Reference』を参照してください。

例8-3は、diskIsFull通知をジョブに送信する方法を示しています。

例8-3 ジョブへの通知の送信

// send the 'diskIsFull' notification
scheduler.notify(new Notification("diskIsFull");

8.4 トリガーと通知に関するFAQ

タイムアウト通知はいつ送信されますか。

タイムアウト通知は、ジョブの有効期限が切れると送信されます。

ユーザーはタイムアウト通知をトリガーに送信できますか。

いいえ。タイムアウトは、ジョブ・スケジューラのみが送信できます。