WebLogic JMX Service プログラマーズ ガイド
![]() |
![]() |
![]() |
![]() |
WebLogic Server には、特定の日時または一定の間隔で通知が送信されるようにコンフィグレーションできるタイマー サービスがあります。それらのタイマー通知をリスンして応答するには、JMX 通知リスナを作成してそれをタイマー サービスに登録します。
WebLogic タイマー サービスは、標準の JMX タイマー サービスを、WebLogic Server の実行スレッド内および WebLogic Server ユーザ アカウントのセキュリティ コンテキスト内で実行できるように拡張したものです (実行スレッドを使用すると、アプリケーションでのサーバ リソースの利用方法を調整したりパフォーマンスを最適化したりできます。詳細については、『WebLogic Server パフォーマンス チューニング ガイド』の「実行キューによるスレッド使用の制御」を参照してください)。
以下の節では、WebLogic タイマー サービスの使い方を説明します。
WebLogic Server では、特定のサーバ インスタンスにデプロイされたすべてのリソースからアクセスできる一元的なタイマー サービスは提供されません。代わりに、各アプリケーションで、タイマー サービスのインスタンスが必要なときに作成および管理されます。サーバ インスタンスが再起動するたびに、各アプリケーションでは必要なタイマー サービスのコンフィグレーションを再インスタンス化する必要があります。
通知を送信し、それらの通知を受信するリスナを作成するように WebLogic タイマー サービスをコンフィグレーションするには、以下のことを行うクラスを作成します。
このクラスでは、addNotification
API を複数回呼び出して、さまざまな時刻や時間間隔で通知オブジェクトを送信するように Timer
MBean をコンフィグレーションできます。
「通知を送信するように Timer MBean をコンフィグレーションする」を参照してください。
このクラスでは、複数のリスナとフィルタを Timer
MBean インスタンスに登録できます。
リスナの作成と登録については、「WebLogic Server MBean からの通知のリスン : 主な手順」を参照してください。
通知を受信すると、リスナで TimerNotification
のメソッドを呼び出して通知からデータを取得できます。
アプリケーションには、Timer
MBean を作成しコンフィグレーションする複数のクラスを組み込めます。 各クラスは、独自の Timer
MBean インスタンスを使用し、それによってインスタンス化された Timer
MBean からの通知のみをリスンします。
通知を送信するように Timer
MBean インスタンスをコンフィグレーションするには、MBean の addNotification
メソッドを呼び出します。このメソッドには、通知の頻度をコンフィグレーションしたり、handback オブジェクトを指定したりするパラメータがあります。
addNotification
メソッドを呼び出すと、タイマー サービスにより TimerNotification
オブジェクトが作成され、その新しいオブジェクトの識別子が返されます。この識別子を使用すると、タイマーから TimerNotification
オブジェクトの情報を取得したり、タイマーの通知のリストからオブジェクトを削除したりできます。指定した時刻になると、タイマー サービスは TimerNotification
オブジェクトを handback オブジェクトの参照と共に送信します。
addNotification
のメソッド シグネチャは次のとおりです。
addNotification (java.lang.String type, java.lang.String message,
java.lang.Object userData,java.util.Date startTime,
long period, long nbOccurences)
表 7-1 で、addNotification
API の各パラメータについて説明します。詳細については、「WebLogic Server の Javadoc」で weblogic.management.timer.Timer
を参照してください。
|
|
|
|
|
|
|
|
|
簡単に日付を指定できるようにするために、Timer
MBean には次の整数定数が用意されています。
ONE_SECOND
。1 秒間のミリ秒数に解決されます。ONE_MINUTE
。1 分間のミリ秒数に解決されます。ONE_HOUR
。1 時間のミリ秒数に解決されます。ONE_DAY
。1 日のミリ秒数に解決されます。ONE_WEEK
。1 週間のミリ秒数に解決されます。たとえば、次のコードでは 1 日 1 回午前 0 時に TimerNotification
オブジェクトを送信するようにタイマー サービスがコンフィグレーションされます。
java.util.Date midnight =
java.util.Calendar.getInstance.set(HOUR_OF_DAY=24:00:00).getTime();
addNotification (eachMidnight, "the time is midnight",
this,midnight,Timer.ONE_DAY);
指定した時刻と日付が現在の時刻と日付より前の場合、addNotification
メソッドではそのエントリを次のように更新しようとします。
period
パラメータの値が指定されている場合は、日付が現在の日付より後になるまで period
値で date
値がインクリメントされる。たとえば、period
値として ONE_DAY
が指定されている場合、addNotification
により日付が現在の日付より後になるまで 1 日単位で date
値がインクリメントされます。nbOccurrences
パラメータの値が指定されている場合は、上記で説明したとおりに通知の日付が更新される。date
値がインクリメントされるたびに、指定された発生数が 1 つずつデクリメントされます。発生数が 0
になっても通知の日付が現在の日付より前の場合は、IllegalArgumentException
が送出されます。period
パラメータの値が指定されていない場合、通知の日付は更新できず、IllegalArgumentException
が送出される。
コード リスト 7-1 のコードは、通知を毎分送信するようにタイマー サービスをコンフィグレーションするサーブレット リスナです。このコードは次のように機能します。
サーブレットを再デプロイまたはアンデプロイするときには、Timer
変数で表される Timer
MBean インスタンスの Timer.stop
メソッドが呼び出されます。
import java.util.Date;
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.InstanceNotFoundException;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import weblogic.management.timer.Timer;
// NotificationListener を実装
public final class LifecycleListener implements ServletContextListener,
NotificationListener {
private static final long PERIOD = Timer.ONE_MINUTE;
private Timer timer;
private Integer notificationId;
public void contextInitialized(ServletContextEvent event) {
System.out.println(">>> contextInitialized called.");
// Timer MBean をインスタンス化
timer = new Timer();
// このクラスをリスナとして登録
timer.addNotificationListener(this, null, "some handback object");
// 通知を Timer に追加し、Timer が返す ID を
// 変数に割り当てる
Date timerTriggerAt = new Date((new Date()).getTime() + 5000L);
notificationId = timer.addNotification("oneMinuteTimer",
"a recurring call", this,
timerTriggerAt, PERIOD);
timer.start();
System.out.println(">>> timer started.");
}
public void contextDestroyed(ServletContextEvent event) {
System.out.println(">>> contextDestroyed called.");
try {
timer.stop();
timer.removeNotification(notificationId);
System.out.println(">>> timer stopped.");
} catch (InstanceNotFoundException e) {
e.printStackTrace();
}
}
/* コールバック メソッド */
public void handleNotification(Notification notif, Object handback) {
System.out.println(">>> "+(new Date())+
" timer handleNotification="+notif+
", handback="+handback);
}
}
サーブレット リスナのデプロイメント記述子では、<listener>
および <listener-class>
文を使用して上の例のクラスを宣言する必要があります。コード リスト 7-2 を参照。
コード リスト 7-2サーブレット リスナのデプロイメント記述子
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application
2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
<listener>
<listener-class>
examples.jmxtimer.LifecycleListener
</listener-class>
</listener>
</web-app>
Timer
MBean では、次のいずれかの場合にリストから通知を削除します。
Timer
MBean には、通知を削除する以下の API も用意されています。
removeAllNotifications()
。Timer
MBean インスタンスに登録されているすべての通知を削除します。removeNotification(java.lang.Integer id)
。指定した ID と一致する ID を持つ通知を削除します。addNotification
メソッドは、呼び出されるとこの ID を返します。Timer
API でも ID を取得できます。 removeNotifications(java.lang.String type)
。指定したタイプと一致するタイプの通知をすべて削除します。特定の Timer
MBean インスタンスに対してこれらの通知削除 API を使用するには、Timer
MBean のインスタンス化に使用するクラスにその API を追加します。コード リスト 7-1 の timer.start()
および timer.stop()
の呼び出しと同様に、各 API をメソッドにラップします。たとえば、Timer
MBean インスタンスを Timer
という変数に割り当てた場合は、次のメソッドをクラスに追加します。
public void removeMyNotification (java.lang.Integer id) {
timer.removeNotification(id);
}
詳細については、「WebLogic Server の Javadoc」で weblogic.management.timer.Timer
を参照してください。
![]() |
![]() |
![]() |