Oracle® Fusion Middleware Oracle WebLogic Server JMXによる管理可能アプリケーションの開発 12c (12.2.1.2.0) E82884-01 |
|
前 |
次 |
この章の内容は以下のとおりです。
通知を送信するように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インスタンスが通知を送信するように構成するには、次の手順に従います。
指定した時刻になると、タイマー・サービスは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
を参照してください。