Oracle® Fusion Middleware Oracle WebLogic Server JMXによる管理可能アプリケーションの開発 12c (12.2.1) E70010-01 |
|
![]() 前 |
![]() 次 |
この章では、WebLogic Server JMXタイマー・サービスを使用して、JMXクライアントが指定した時間に、または定期的にタスクを実行する方法について説明します。
この章の内容は以下のとおりです。
通知を送信するようにJMXタイマー・サービスを構成したり、指定されたアクションで通知に応答するようにリスナーを構成できます。たとえば、JMXモニターを毎日午前9時から午後9時まで実行する必要があるとします。この場合、毎日午前9時に通知を送信するようにJMXタイマー・サービスを構成することによって、JMXリスナーからモニターを起動できます。タイマー・サービスで午後9時に別の通知を送信し、その通知によってリスナーからモニターMBeanを停止できます。
JDKには、JMXタイマー・サービスの実装(Java SE 7 API仕様
のjavax.management.timer.Timer (http://docs.oracle.com/javase/7/docs/api/javax/management/timer/Timer.html
)を参照)が組み込まれていますが、このタイマー・サービスのリスナーは、サーバーのJVM内の独自のスレッドで動作します。
WebLogic Serverには、標準のタイマー・サービスの拡張が組み込まれています。これにより、タイマー・リスナーはWebLogic Serverが管理するスレッドおよびWebLogic Serverユーザー・アカウントのセキュリティ・コンテキストの中で実行されます。
各JMXクライアントに対して、タイマー・サービスのインスタンスを構築および管理します。WebLogic ServerにはすべてのJMXクライアントが使用する集中型タイマー・サービスは用意されていません。サーバー・インスタンスが再起動するたびに、各JMXクライアントは必要なタイマー・サービスの構成を再インスタンス化する必要があります。
WebLogic Serverタイマー・サービスを作成するには、次の手順に従います。
アプリケーションにJMXリスナー・クラスを作成します。
JMXリスナーの全般的な作成手順については、『Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発』の通知リスナーの作成に関する項を参照してください。
以下のことを行うクラスを作成します。
weblogic.management.timer.TimerMBean
のインスタンスを構成して、指定の時間または間隔でjavax.management.timer.TimerNotification
通知を送信するようにします。Java SE 7 API仕様
のTimerNotification (http://docs.oracle.com/javase/7/docs/api/javax/management/timer/TimerNotification.html
)を参照してください。
構成する通知ごとに、タイマーによる通知の送信を引き起こすイベントを識別するString
をType
属性に組み込みます。
「通知を送信するようにタイマーMBeanを構成する」を参照してください。
構成したタイマーMBeanにリスナーとフィルタ(任意)を登録します。
構成したタイマーMBeanでタイマーを起動します。
全般的な手順については、『Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発』の通知フィルタの構成に関する項および通知リスナーとフィルタの登録に関する項を参照してください。
タイマー・サービスの使用後にタイマーMBeanの登録を解除し、MBeanサーバーとの接続を閉じます。
リスナーとその他のJMXクラスをパッケージ化し、WebLogic Serverにデプロイします。『Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発』のリスナーのパッケージ化とWebLogic Serverへのデプロイに関する項を参照してください。
Timer
MBeanインスタンスが通知を送信するように構成するには、次の手順に従います。
ドメイン実行時MBeanサーバーへの接続を初期化します。
『Oracle WebLogic Server JMXによるカスタム管理ユーティリティの開発』のMBeanサーバーへのリモート接続に関する項を参照してください。
タイマーMBeanインスタンスのObjectName
を作成します。
Java SE 7 API仕様
のjavax.management.ObjectName (http://docs.oracle.com/javase/7/docs/api/javax/management/ObjectName.html
)を参照してください。
オブジェクト名は組織名で開始し、その名前の中にタイマー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 |
(オプション)通知が行われる回数を指定します。このパラメータの値をゼロにするか、定義しない( このパラメータを指定すると、タイマー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();
Java SE 7 API仕様
のjava.util.Calendar (http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html
)を参照してください。
例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; // Initialize the object name for RuntimeServiceMBean // so it can be used throughout the class. static { try { service = new ObjectName( "com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.ru ntime.RuntimeServiceMBean"); }catch (MalformedObjectNameException e) { throw new AssertionError(e.getMessage()); } } /* * Initialize connection to the Runtime MBean Server. * This MBean is the root of the runtime MBean hierarchy, and * each server in the domain hosts its own instance. */ 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 { /* Invokes a custom method that establishes a connection to the * Runtime MBean Server and uses an instance of * MBeanServerConnection to represents the connection. The custom * method assigns the MBeanServerConnection to a class-wide, static * variable named "connection". */ initConnection(hostname, portString, username, password); //Creates and registers the timer 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); // Configures the timer MBean to emit a morning notification. // Assigns the return value of addNotification to a variable so that // it will be possible to invoke other operations for this specific // notification. 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" }); //Instantiates your listener class and configures a filter to // forward only timer messages. MyListener listener = new MyListener(); NotificationFilterSupport filter = new NotificationFilterSupport(); filter.enableType("mycompany.timer"); //Uses the MBean server's addNotificationListener method to //register the listener and filter with the timer MBean. System.out.println("===> ADD NOTIFICATION LISTENER TO "+ timerON); connection.addNotificationListener(timerON, listener, filter, null); System.out.println("\n[myListener]: Listener registered ..."); //Starts the timer. connection.invoke(timerON, "start", new Object[] { }, new String[] {}); //Keeps the remote client active. 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オブジェクトを返します(「通知を送信するようにタイマーMBeanを構成する」手順4を参照)。
removeNotifications(java.lang.String type)
: タイプが指定のタイプと対応するすべての通知を削除します。通知のタイプ値は、通知オブジェクトの作成時に定義します。表5-1を参照してください。
詳細は、WebLogic Server APIリファレンスの
weblogic.management.timer.Timerを参照してください。