![]() |
![]() |
|
|
| |
WebLogic Time を使用した実装
以下の節では、WebLogic Time サービス(非推奨)の実装方法について説明します。
クライアント上での反復トリガのスケジューリング
反復トリガをスケジューリングする最も単純なケースは、WebLogic クライアント上でスケジューリングおよび実行される ScheduledTrigger を作成することです。このケースでは、Schedulable と Triggerable の両方を実装するクラスを記述し、これらのインタフェースのメソッドを実装します。
次のコード例は、どのようにトリガをスケジュールして実行するかを示したものです。
import weblogic.time.common.*;
import weblogic.common.*;
import java.util.*;
import weblogic.jndi.*;
import javax.naming.*;
import java.util.*;
class myTrigger implements Schedulable, Triggerable {
...
}
まず、TimeServices ファクトリから ScheduledTrigger オブジェクトを取得する必要があります。TimeServices ファクトリは、getT3Services()
メソッドを介して WebLogic Server 上の T3Services リモート ファクトリ スタブから取得します。
注意: クライアント アプリケーションではなくWebLogic Server インスタンスで TimeServices
インタフェースに対するハンドルを取得するには、静的メソッドの weblogic.common.T3Services.getT3Services()
を使用します。
次に、トリガの schedule()
メソッドと cancel()
メソッドを呼び出します。次に例を示します
public myTrigger() throws TimeTriggerException {
// T3Services ファクトリを取得する
T3ServicesDef t3 = getT3Services("t3://localhost:7001");
// ファクトリから ScheduledTrigger を要求する
// このクラスをスケジューリングと実行に使用する
ScheduledTriggerDef std =
t3services.time().getScheduledTrigger(this, this);
// スケジューリングを開始する
std.schedule();
// クラスは、トリガのスケジューリング後に他の作業を行う場合もある
// 終了したら、トリガをキャンセルする
std.cancel();
}
クラスは、以下のインタフェースに定義されているメソッドを実装しなければなりません。
Schedulable
schedule()
という 1 つのメソッドを持っています。このメソッドを使用すると、トリガを実行する時刻を設定できます。
public long schedule(long time) {
// 5 秒ごとのトリガをスケジューリングする
return time + 5000;
}
Triggerable
trigger()
だけを持っています。ここでは、クライアントは時刻が設定されたトリガに反応してアクションを起こします。
public void trigger() {
// trigger メソッドはアクションが起こる場所である
System.out.println("Trigger called");
}
このコード例には、スケジューラとトリガの両方を実装する単一のクラスが含まれています。これは、2 つの必須メソッドがスケジューリングまたは実行に必要なクラス変数を共有するので便利です。
WebLogic クライアントからの反復サーバサイド トリガのスケジューリング
WebLogic フレームワーク内の任意の場所で実行できる、より柔軟なスケジューラとトリガを記述できます。これを実装するには、ScheduleDef
と TriggerDef
を、より単純なインタフェース Schedulable
と Triggerable
の代わりに実装します。この例では、WebLogic Server 上(または WebLogic フレームワーク内の任意の場所)で再スケジューリングおよび実行される反復トリガを作成するという、より柔軟な実装を示します。
このシナリオでスケジューリング済みトリガを作成する手順は次のとおりです。まず、ScheduleDef と TriggerDef を実装するクラスを記述する必要があります。この例では、これらのインタフェースを別々のクラスに実装します。
これらのクラスをコンパイルして、WebLogic Server の serverclasses
ディレクトリに置きます。最後に、クライアント アプリケーションからこれらのクラスを使って ScheduledTrigger
を作成します。
手順 1. ScheduleDef および TriggerDef インタフェースの実装
この例では、setServices()
および scheduleInit()
メソッドが呼び出されるように、スケジューラは Schedulable ではなく ScheduleDef を実装します。同じ理由で、トリガも Triggerable ではなく TriggerDef を実装します。これらのオブジェクトは、ParamSet で初期化できるという点と、T3Services
スタブを通して WebLogic サービスにアクセスできるという点が、これら自身が実装するインタフェースとは異なります。これら 2 つの相違点は、以下の理由で重要です。
クライアントサイドのデプロイメントとサーバサイドのデプロイメントで異なるバージョンを作成する必要がありません。これは、T3ServicesDef
インタフェースがリモート スタブだからです。
オブジェクトを動的にインスタンス化するときは、デフォルト コンストラクタを呼び出さなければなりません。したがって、Time インタフェースを含むすべてのサービス関連インタフェースでは、オブジェクトの初期化パラメータを渡すことができるように、ParamSet を引数として取る scheduleInit()
メソッドを実装する必要があります。
次に、ScheduleDef の単純な実装を示します。
package examples.time;
import weblogic.common.*;
import weblogic.time.common.*;
import java.util.*;
class MyScheduler implements ScheduleDef {
private int interval = 0;
private T3ServicesDef services;
public void setServices(T3ServicesDef services) {
this.services = services;
}
public void scheduleInit (ParamSet ps) throws ParamSetException {
interval = ps.getParam("interval").asInt();
}
public long schedule(long currentMillis) {
return currentMillis + interval;
}
}
次に、TriggerDef を実装する単純なクラスを示します。この場合、Trigger のパラメータを設定または取得する必要はありません。つまり、何もしないメソッドを実装します。
package examples.time;
import weblogic.common.*;
import weblogic.time.common.*;
import java.util.*;
public class MyTrigger implements TriggerDef {
private T3ServicesDef services;
public void setServices(T3ServicesDef services) {
this.services = services;
}
public void triggerInit (ParamSet ps) throws ParamSetException {
// 空のメソッド定義
}
public void trigger(Schedulable sched) {
System.out.println("Trigger called");
}
}
手順 2. WebLogic クライアントからの ScheduledTrigger の作成
スケジューラとトリガを設定するこのメソッドでは、getScheduledTrigger()
ファクトリ メソッドに渡す Scheduler および Trigger オブジェクトを作成する必要があります。これらは、
手順 1. ScheduleDef および TriggerDef インタフェースの実装で既に作成してあります。
これらのクラスは、既にコンパイルして WebLogic Server の CLASSPATH にデプロイしてあります。次に、これらのクラスを使ってサーバの JVM で実行するトリガをスケジューリングするクライアントを記述します。
ParamSet を使って、クライアントと WebLogic Server がインスタンス化するオブジェクトとの間で初期化パラメータを渡します。ScheduleDef を実装するために手順 1 で記述したクラスは、呼び出し側が設定するパラメータ 「interval」に依存するため、1 つの Param を持つ ParamSet を作成します。TriggerDef を実装するために記述したクラスは、初期化パラメータは必要としません。
T3ServicesDef t3services = getT3Services("t3://localhost:7001");
// ParamSet を作成して、ScheduleDef オブジェクトの
// 初期化パラメータを渡す。1 つのパラメータ「interval」を
// 10 秒に設定する
ParamSet schedParams = new ParamSet();
schedParams.setParam("interval", 10000);
getT3Services()
メソッドをクライアント クラスに追加します。次に、サーバ上で ScheduledTrigger をインスタンス化する、Scheduler および Trigger ラッパー オブジェクトを作成します。Scheduler および Trigger ラッパー オブジェクトは、必要であれば、ターゲット クラスの名前とこれを初期化する ParamSet を保持します。
Scheduler scheduler =
new Scheduler("examples.time.MyScheduler", schedParams);
Trigger trigger =
new Trigger("examples.time.MyTrigger");
最後に、Time サービス オブジェクト ファクトリを使用して ScheduledTrigger を作成します。これは、先ほど作成した Scheduler と Trigger という 2 つの引数を取ります。
ScheduledTriggerDef std =
t3.services.time().getScheduledTrigger(scheduler, trigger);
getScheduledTrigger()
メソッドは、ScheduledTriggerDef object を返します。実行を開始するために、クライアントは ScheduledTriggerDef の schedule()
および cancel()
メソッドを呼び出します。
反復スケジュールを設定する場合、このパッケージの一部であるユーティリティ クラス TimeRepeat も使用できます。次に、TimeRepeat
クラスを使用して、10 秒ごとに繰り返す ScheduledTrigger
の定期スケジュールを設定する単純なコード例を示します。ここでも getT3Services()
メソッドを使用して WebLogic サーバサイド サービスにアクセスしています。
T3ServicesDef t3services = getT3Services("t3://localhost:7001");
Scheduler scheduler = new Scheduler(new TimeRepeat(1000 * 10));
Trigger trigger = new Trigger("examples.time.MyTrigger");
ScheduledTriggerDef std =
t3services.time().getScheduledTrigger(scheduler, trigger);
std.schedule();
複雑なスケジュールの設定
Schedulable オブジェクトの schedule()
メソッドを使用すると、複雑なスケジュールを自由に設定できます。次に、スケジューリングの例とヒントをいくつか示します。
schedule()
メソッドの引数で実行時刻を指定する方法は、以下の 2 通りです。
schedule()
メソッドは long 値を返します。この値を使用すると、反復トリガを設定できます。単純に、schedule()
メソッドが最後に呼び出された時刻と、スケジュールを繰り返す間隔(ミリ秒)を返します。
再スケジューリング
この例では、schedule()
メソッドを記述して、trigger()
メソッドに対する各呼び出しの間をインクリメントする間隔だけ遅延させます。この例では、schedule()
メソッドと trigger()
メソッドは、同じクラスに実装されています。
trigger()
メソッドでは、private int の delay を使用して、インクリメントする遅延を設定します。delay は、クラス コンストラクタで 0 に初期化されます。trigger を呼び出すたびに、それは自己のスケジュールをインクリメンタルに調整します。
public void trigger() {
System.out.println("Trigger called");
// 任意のタスクを実行する . . .
System.out.println("Trigger completed");
// delay に 1000 ミリ秒を追加する
delay += 1000;
}
schedule()
メソッドでは、最後にスケジューリングされた実行時刻に、最後にスケジューリングされた実行によってインクリメントされた遅延(ミリ秒)を足した時刻を、トリガの次の実行として返します。また、スケジューリングを終了するために、遅延に上限を指定します。
public long schedule(long t) {
System.out.println("--------------------------------------");
if (delay > 10000) {
System.out.println("Cancelling Timer");
return 0;
}
else {
System.out.println("Scheduling next trigger for " +
delay/1000 + " seconds");
return t + delay;
}
}
ScheduledTrigger の停止
ScheduledTrigger は、以下の 2 つの方法で停止できます。
これら 2 つのメソッドの間には、若干の違いがあります。schedule()
メソッドからゼロを返すと、スケジュールはすぐに終了します。cancel()
メソッドを呼び出すと、trigger()
の次にスケジューリングされたインスタンスまでクロックは動作し続け、そこでキャンセルされます。
![]() |
![]() |