|
以下の節では、WebLogic Server JMX タイマー サービスの使い方を説明します。
JMX クライアントが指定された時刻または一定期間ごとにタスクを実行する必要がある場合、通知を送信するように JMX タイマー サービスをコンフィグレーションしたり、指定されたアクションで通知に応答するリスナをコンフィグレーションしたりできます。
たとえば、JMX モニタを毎日午前 9 時から午後 9 時まで実行する必要があるとします。この場合、毎日午前 9 時に通知を送信するように JMX タイマー サービスをコンフィグレーションすることによって、JMX リスナからモニタを起動できます。タイマー サービスで午後 9 時に別の通知を送信し、その通知によってリスナからモニタ MBean を停止できます。
JDK には、JMX タイマー サービスの実装 (J2SE 5.0 API 仕様の javax.management.timer.Timer
を参照) が組み込まれていますが、このタイマー サービスのリスナは、サーバの JVM 内の独自のスレッドで動作します。
WebLogic Server には、標準の JMX タイマー サービスの拡張が組み込まれています。この拡張では、タイマー リスナは WebLogic Server が管理するスレッドおよび WebLogic Server ユーザ アカウントのセキュリティ コンテキストの中で実行されます。
各 JMX クライアントに対して、タイマー サービスのインスタンスを構築および管理します。WebLogic Server にはすべての JMX クライアントが使用する集中型タイマー サービスは用意されていません。サーバ インスタンスが再起動するたびに、各 JMX クライアントは必要なタイマー サービスのコンフィグレーションを再インスタンス化する必要があります。
WebLogic Server タイマー サービスを作成するには、次の手順に従います。
JMX リスナの作成については、『JMX によるカスタム管理ユーティリティの開発』の「通知リスナを作成する」を参照してください。
weblogic.management.timer.TimerMBean
のインスタンスをコンフィグレーションして、指定の時間または間隔で javax.management.timer.TimerNotification
通知を送信するようにする。J2SE 5.0 API 仕様の TimerNotification
を参照してください。
コンフィグレーションする通知ごとに、タイマーによる通知の送信を引き起こすイベントを識別する String
を Type
属性に組み込みます。
「通知を送信するように Timer MBean をコンフィグレーションする」を参照してください。
全般的な手順については、『JMX によるカスタム管理ユーティリティの開発』の「通知フィルタをコンフィグレーションする」および「通知リスナとフィルタを登録する」を参照してください。
Timer
MBean インスタンスが通知を送信するようにコンフィグレーションするには、次の手順に従います。
『JMX によるカスタム管理ユーティリティの開発』の「MBean サーバへのリモート接続の作成」を参照してください。
ObjectName
を作成します。
J2SE 5.0 API 仕様の javax.management.ObjectName
を参照してください。
オブジェクト名は組織名で開始し、その名前の中にタイマー MBean インスタンスの目的を明確に特定する主要プロパティを含めることをお勧めします。
たとえば、"mycompany:Name=myDailyTimer,Type=weblogicTimer"
というように指定します。
javax.management.MBeanServerConnection.createMBean(String
classname
ObjectName
name
)
メソッドを使用します。ここで、
MBean の addNotification
オペレーションを呼び出します。表 5-1 に、addNotification
オペレーションの各パラメータの説明を示します。詳細については、WebLogic Server API リファレンスの weblogic.management.timer.Timer
を参照してください。
addNotification
オペレーションは TimerNotification
オブジェクトを作成し、その TimerNotification
オブジェクトを一意に識別する整数が含まれる Integer
型の handback オブジェクトを返します。
start()
オペレーションを呼び出して、そのタイマーを起動します。
指定した時刻になると、タイマー サービスは TimerNotification
オブジェクトを handback オブジェクトの参照と一緒に送信します。
|
|
java.util.Date
オブジェクトのコンストラクタは、そのオブジェクトを初期化して、Date
オブジェクトの作成時間 (最も近いミリ秒) を格納します。異なる日時を指定するには、次の手順に従います。
たとえば、次のコードでは、午前 0 時を表す Date
オブジェクトがコンフィグレーションされます。
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.set(java.util.Calendar.HOUR_OF_DAY, 24);
java.util.Date morning = cal.getTime();
J2SE 5.0 API 仕様の java.util.Calendar
を参照してください。
コード リスト 5-1 のコードでは、午前 9 時から 5 分ごとに通知を送信する weblogic.management.timer.Timer
のインスタンスが作成されます。
Timer
クラスへのアクセスが必要なのは JMX クライアントではなく、MBean サーバだけです。javax.management.Notification
の拡張であるため、汎用の JMX リスナを使用してタイマー通知をリスンできる。import java.util.Hashtable;
import java.io.IOException;
import java.net.MalformedURLException;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.MalformedObjectNameException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;
import javax.management.NotificationFilterSupport;
public class RegisterTimer {
private static MBeanServerConnection connection;
private static JMXConnector connector;
private static final ObjectName service;
// クラス全体で使用できるように
// RuntimeServiceMBean のオブジェクト名を初期化する
static {
try {
service = new ObjectName(
"com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.ru
ntime.RuntimeServiceMBean");
}catch (MalformedObjectNameException e) {
throw new AssertionError(e.getMessage());
}
}
/*
* 実行時 MBean サーバへの接続を初期化する
* この MBean は実行時 MBean 階層のルートであり、
* ドメイン内の各サーバは独自のインスタンスをホストする
*/
public static void initConnection(String hostname, String portString,
String username, String password) throws IOException,
MalformedURLException {
String protocol = "t3";
Integer portInteger = Integer.valueOf(portString);
int port = portInteger.intValue();
String jndiroot = "/jndi/";
String mserver = "weblogic.management.mbeanservers.runtime";
JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostname, port,
jndiroot + mserver);
Hashtable h = new Hashtable();
h.put(Context.SECURITY_PRINCIPAL, username);
h.put(Context.SECURITY_CREDENTIALS, password);
h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
"weblogic.management.remote");
connector = JMXConnectorFactory.connect(serviceURL, h);
connection = connector.getMBeanServerConnection();
}
public static void main(String[] args) throws Exception {
String hostname = args[0];
String portString = args[1];
String username = args[2];
String password = args[3];
try {
/* 実行時 MBean サーバへの接続を確立するカスタム メソッドを起動し、
* MBeanServerConnection のインスタンスを
* 使用して接続を表現する
* カスタム メソッドは MBeanServerConnection を
* クラス全体のスタティック変数「connection」に代入する
*/
initConnection(hostname, portString, username, password);
// タイマー MBean を作成および登録する
ObjectName timerON = new
ObjectName("mycompany:Name=myDailyTimer,Type=weblogicTimer");
String classname = "weblogic.management.timer.Timer";
connection.createMBean(classname, timerON);
System.out.println("===> created timer mbean "+timerON);
// タイマー MBean をコンフィグレーションして朝の通知を送信する
// addNotification の戻り値を変数に代入して、
// この特定の通知に対する他のオペレーションを
// 呼び出せるようにする
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.set(java.util.Calendar.HOUR_OF_DAY, 9);
java.util.Date morning = cal.getTime();
String myData = "Timer notification";
Integer morningTimerID = (Integer) connection.invoke(timerON,
"addNotification",
new Object[] { "mycompany.timer.notification.after9am" ,
"After 9am!", myData, morning, new Long(60000) },
new String[] {"java.lang.String", "java.lang.String",
"java.lang.Object", "java.util.Date", "long" });
// リスナ クラスをインスタンス化し、タイマー メッセージだけが
// 転送されるようにフィルタをコンフィグレーションする
MyListener listener = new MyListener();
NotificationFilterSupport filter = new NotificationFilterSupport();
filter.enableType("mycompany.timer");
// MBean サーバの addNotificationListener メソッドを使用して
// リスナとフィルタをタイマー MBean に登録する
System.out.println("===> ADD NOTIFICATION LISTENER TO "+ timerON);
connection.addNotificationListener(timerON, listener, filter, null);
System.out.println("\n[myListener]: Listener registered ...");
// タイマーを起動する
connection.invoke(timerON, "start", new Object[] { }, new String[] {});
// リモート クライアントをアクティブに保つ
System.out.println("Pausing.Press Return to end...........");
System.in.read();
} catch(Exception e) {
System.out.println("Exception: " + e);
e.printStackTrace();
}
}
}
タイマー MBean は、次のいずれかの場合にリストから通知を削除します。
タイマー MBean は、通知を削除する以下のオペレーションも提供します。
removeAllNotifications()
。タイマー MBean インスタンスに登録されているすべての通知を削除します。removeNotification(java.lang.Integer id)
。handback オブジェクトに指定する整数値が含まれる通知を削除します。addNotification
メソッドは、呼び出された場合に、この handback オブジェクトを返します (「通知を送信するように Timer MBean をコンフィグレーションする」の手順 4 を参照)。removeNotifications(java.lang.String type)
。タイプが指定のタイプと対応するすべての通知を削除します。通知のタイプ値は、通知オブジェクトの作成時に定義します。表 5-1 を参照してください。
詳細については、WebLogic Server API リファレンスの weblogic.management.timer.Timer
を参照してください。