Oracle® Fusion Middleware Oracle WebLogic Server JMX による管理の容易なアプリケーションの開発 11g リリース 1 (10.3.1) B55538-01 |
|
戻る |
次へ |
以下の節では、WebLogic Server JMX タイマー サービスの使い方を説明します。
JMX クライアントが指定された時刻または一定期間ごとにタスクを実行する必要がある場合、通知を送信するように JMX タイマー サービスをコンフィグレーションしたり、指定されたアクションで通知に応答するリスナをコンフィグレーションしたりできます。
たとえば、JMX モニタを毎日午前 9 時から午後 9 時まで実行する必要があるとします。この場合、毎日午前 9 時に通知を送信するように JMX タイマー サービスをコンフィグレーションすることによって、JMX リスナからモニタを起動できます。タイマー サービスで午後 9 時に別の通知を送信し、その通知によってリスナからモニタ MBean を停止できます。
JDK には、JMX タイマー サービスの実装 (http://java.sun.com/javase/6/docs/api/javax/management/timer/Timer.html
で J2SE 6.0 API 仕様の javax.management.timer.Timer
を参照)が組み込まれていますが、このタイマー サービスのリスナは、サーバの JVM 内の独自のスレッドで動作します。
WebLogic Server には、標準の JMX タイマー サービスの拡張が組み込まれています。この拡張では、タイマー リスナは WebLogic Server が管理するスレッドおよび WebLogic Server ユーザ アカウントのセキュリティ コンテキストの中で実行されます。
各 JMX クライアントに対して、タイマー サービスのインスタンスを構築および管理します。WebLogic Server にはすべての JMX クライアントが使用する集中型タイマー サービスは用意されていません。サーバ インスタンスが再起動するたびに、各 JMX クライアントは必要なタイマー サービスのコンフィグレーションを再インスタンス化する必要があります。
WebLogic Server タイマー サービスを作成するには、次の手順に従います。
アプリケーションに JMX リスナ クラスを作成します。
JMX リスナの作成については、『Oracle Fusion Middleware Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発』の「通知リスナを作成する」を参照してください。
以下のことを行うクラスを作成します。
weblogic.management.timer.TimerMBean
のインスタンスをコンフィグレーションして、指定の時間または間隔で javax.management.timer.TimerNotification
通知を送信するようにする。http://java.sun.com/javase/6/docs/api/javax/management/timer/TimerNotification.html
にある『J2SE 6.0 API 仕様』の「TimerNotification
」を参照してください。
コンフィグレーションする通知ごとに、タイマーによる通知の送信を引き起こすイベントを識別する String
を Type
属性に組み込みます。
「通知を送信するように Timer MBean をコンフィグレーションする」を参照してください。
コンフィグレーションしたタイマー MBean にリスナとフィルタ (任意) を登録する。
コンフィグレーションしたタイマー MBean でタイマーを起動する。
全般的な手順については、『Oracle Fusion Middleware Oracle WebLogic Server JMX によるカスタム管理ユーティリティの開発』の「通知フィルタをコンフィグレーションする」および「通知リスナとフィルタを登録する」を参照してください。
タイマー サービスの使用後にタイマー MBean の登録を解除し、MBean サーバとの接続を閉じる。
リスナとその他の JMX クラスをパッケージ化し、WebLogic Server にデプロイします。『Oracle Fusion Middleware Oracle WebLogic Server JMX によるカスタム管理ユーティリティの開発』の「リスナをパッケージ化し、WebLogic Server にデプロイする」を参照してください。
Timer
MBean インスタンスが通知を送信するようにコンフィグレーションするには、次の手順に従います。
ドメイン実行時 MBean サーバへの接続を初期化します。
『Oracle Fusion Middleware Oracle Weblogic Server JMX によるカスタム管理ユーティリティの開発』の「MBean サーバへのリモート接続の作成」を参照してください。
タイマー MBean インスタンスの ObjectName
を作成します。
http://java.sun.com/javase/6/docs/api/javax/management/ObjectName.html
にある『J2SE 6.0 API 仕様』の「javax.management.ObjectName
」を参照してください。
オブジェクト名は組織名で開始し、その名前の中にタイマー MBean インスタンスの目的を明確に特定する主要プロパティを含めることをお勧めします。
たとえば、"mycompany:Name=myDailyTimer,Type=weblogicTimer"
というように指定します。
タイマー MBean を作成および登録します。
javax.management.MBeanServerConnection.createMBean(String
classname
ObjectName name)
メソッドを使用します。ここで、
classname
は weblogic.management.timer.Timer
name
はタイマー MBean インスタンスのオブジェクト名
注意 : 作成するタイマー MBean は、WebLogic Server の JMX エージェントで動作します (リモート JMX クライアントからタイマー MBean を作成した場合はクライアント JVM で動作しません)。 |
通知を送信するようにタイマー MBean をコンフィグレーションします。
MBean の addNotification
オペレーションを呼び出します。表 5-1 に、addNotification
オペレーションの各パラメータの説明を示します。詳細については、『WebLogic Server API リファレンス』の「weblogic.management.timer.Timer」を参照してください。
addNotification
オペレーションは TimerNotification
オブジェクトを作成し、その TimerNotification
オブジェクトを一意に識別する整数が含まれる Integer
型の handback オブジェクトを返します。
JMX クライアントが受信する必要があるタイマー通知ごとに手順 4 を繰り返します。
タイマー MBean の start()
オペレーションを呼び出して、そのタイマーを起動します。
指定した時刻になると、タイマー サービスは TimerNotification
オブジェクトを handback オブジェクトの参照と一緒に送信します。
表 5-1 addNotification オペレーションのパラメータ
パラメータ | 説明 |
---|---|
java.lang.String type |
この通知のブロードキャストをトリガするイベントを識別するための文字列。たとえば、毎日午前 0 時にブロードキャストされるようにコンフィグレーションする通知には |
java.lang.String message |
|
java.lang.Object userData |
リスナに送信する必要のあるすべてのデータが格納されたオブジェクトの名前を指定する。通常は、通知を登録したクラス (コールバックとして機能) の参照を指定する。 |
java.util.Date startTime |
タイマーが通知を送信する日時が格納された 「Date オブジェクトの作成」を参照。 |
long period |
(省略可能) 通知の間隔をミリ秒単位で指定する。このパラメータをゼロにするか、定義しない場合 ( |
long nbOccurences |
(省略可能) 通知が行われる回数を指定する。このパラメータの値をゼロにするか、定義しない ( このパラメータを指定すると、Timer MBean が関連する通知を送信するたびに、発生数が 1 ずつデクリメントされる。タイマー MBean の |
java.util.Date
オブジェクトのコンストラクタは、そのオブジェクトを初期化して、Date
オブジェクトの作成時間 (最も近いミリ秒) を格納します。異なる日時を指定するには、次の手順に従います。
java.util.Calendar
のインスタンスを作成します。
Calendar
オブジェクトが時刻または日付を表すようにコンフィグレーションします。
Calendar
オブジェクトの getTime()
メソッドを呼び出します。このメソッドは、Calendar
オブジェクトの時刻を表す 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();
http://java.sun.com/javase/6/docs/api/java/util/Calendar.html
にある『J2SE 6.0 API 仕様』の「java.util.Calendar
」を参照してください。
コード リスト 5-1 のコードでは、午前 9 時から 5 分ごとに通知を送信する weblogic.management.timer.Timer
のインスタンスが作成されます。
コードに関する以下の点に留意してください。
このコードでは、複数のサーバ インスタンスにデプロイされているアプリケーションと一緒に JMX クライアントが動作することを前提として、タイマー MBean が WebLogic Server 実行時 MBean サーバに作成および登録される。この場合、JMX クライアントはタイマー MBean をドメイン内の各実行時 MBean サーバに登録します。
WebLogic Server タイマー MBean のインスタンスは作成されるが、このクラスは WebLogic Server クラスをインポートしない。WebLogic Server 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(300000) }, 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」を参照してください。