JMX による管理の容易なアプリケーションの開発
JMX クライアントが指定された時刻または一定期間ごとにタスクを実行する必要がある場合、JMX タイマー サービスをコンフィグレーションできます。タイマー サービスによって、指定された日時または一定の間隔で通知が送信されます。開発者は、そのタイマー通知をリスンして適切に応答するリスナを作成します。
たとえば、JMX モニタを毎日午前 9 時から午後 9 時まで実行する必要があるとします。この場合、JMX タイマー サービスを使用して毎日午前 9 時に通知を送信することによって、JMX リスナからモニタを起動できます。さらに、タイマー サービスで午後 9 時に別の通知を送信し、その通知によってリスナからモニタ MBean を停止できます。
JDK には、JMX タイマー サービスの実装 (J2SE 5.0 API 仕様の「javax.management.timer.Timer
」を参照) が組み込まれていますが、このタイマー サービスのリスナは、サーバの JVM 内の独自のスレッドで動作します。
WebLogic Server には、標準の JMX タイマー サービスの拡張が組み込まれています。この拡張では、タイマー リスナは WebLogic Server が管理するスレッドおよび WebLogic Server ユーザ アカウントのセキュリティ コンテキストの中で実行されます。
以下の節では、WebLogic タイマー サービスの使い方を説明します。
タイマー サービスを使用する各 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 サーバへのリモート接続の作成」を参照してください。
J2SE 5.0 API 仕様の「javax.management.ObjectName
」を参照してください。
オブジェクト名は組織名で開始し、その名前の中にタイマー MBean インスタンスの目的を明確に特定する主要プロパティを含めることをお勧めします。
たとえば、"mycompany:Name=myDailyTimer,Type=weblogicTimer"
というように指定します。
javax.management.MBeanServerConnection.createMBean(String
classname
ObjectName
name
)
メソッドを使用します。ここで、
classname
は weblogic.management.timer.Timer
name
はタイマー MBean インスタンスのオブジェクト名注意 : 作成するタイマー MBean は、WebLogic Server の Java エージェントで動作します (リモート JMX クライアントからタイマー MBean を作成した場合はクライアント JVM で動作しません)。
MBean の addNotification
処理を呼び出します。表 5-1 に、addNotification
処理の各パラメータの説明を示します。詳細については、WebLogic Server 9.0 API リファレンス Javadoc の weblogic.management.timer.Timer
パッケージを参照してください。
addNotification
処理は TimerNotification
オブジェクトを作成し、その新しい TimerNotification
オブジェクトの識別子 (Integer
) を返します。この識別子を使用すると、タイマーから TimerNotification
オブジェクトの情報を取得するか、タイマーの通知のリストからオブジェクトを削除することができます。
指定した時刻になると、タイマー サービスは 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 リスナを使用してタイマー通知をリスンできます。コード リスト 5-1 タイマー MBean の作成、登録、コンフィグレーション
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)
。ID が指定の ID と一致する通知を削除します。addNotification
メソッドは、呼び出されたときにこの ID を返します。 removeNotifications(java.lang.String type)
。タイプが指定のタイプと対応するすべての通知を削除します。詳細については、WebLogic Server 9.0 API リファレンス Javadoc の weblogic.management.timer.Timer
パッケージを参照してください。