JMX による管理の容易なアプリケーションの開発
![]() |
![]() |
![]() |
![]() |
JMX には、アプリケーションの管理を容易にするために使用できる設計パターンとデプロイメント オプションが存在します。推奨される設計パターンは、Java クラスのインスツルメンテーションが以下の条件を満たしていることを前提としています。
以降の節では、管理が容易なアプリケーションの設計について説明します。
以降の節では、管理が容易なアプリケーションを設計するための推奨事項について説明します。
JMX ではさまざまな設計パターンが定義されていますが、その中でも、最も簡単に記述できる標準 MBean を使用することをお勧めします。標準 MBean を使用する最も単純な設計パターンでは、以下のことを行います。
MBean サーバは、インタフェースを内部参照し、実装を見つけ、インタフェースと実装を MBean として登録します。
この設計パターンでは、管理インタフェースとその実装は、MBean サーバがインタフェースを内部参照できるように、厳格な命名規約に準拠していなければなりません。この命名要件を回避するには、Java クラスを javax.management.StandardMBean
の拡張にします。J2SE 5.0 API 仕様の「StandardMBean
」を参照してください。
JVM には、複数の MBean サーバが存在できます。設計上、ここで決定しなけれならないのは、MBean を JVM のプラットフォーム MBean サーバか WebLogic Server 実行時 MBean サーバのどちらに登録するかです。
JDK 1.5 から、JVM (ローカル プロセス) 内のプロセスはプラットフォーム MBean サーバをインスタンス化できるようになりました。この MBean は JDK によって提供され、JVM 自体をモニタするための MBean を備えています。ローカル クラスもこの MBean サーバに MBean を登録できます。
WebLogic Server インスタンス用の JVM は、プラットフォーム MBean サーバの他に実行時 MBean サーバも備えることができます。管理サーバもドメインの実行時 MBean サーバと編集 MBean サーバを備えていますが、カスタム MBean を登録できるのは実行時 MBean サーバだけです。『JMX によるカスタム管理ユーティリティの開発』の「MBean サーバ」を参照してください。
カスタム MBean は、その実行時 MBean サーバに登録することをお勧めします。その場合、以下のことに留意してください。
実行時 MBean サーバは、その javax.management.MBeanServer
インタフェースを JNDI ツリーに登録します。『JMX によるカスタム管理ユーティリティの開発』の「実行時 MBean サーバへのローカル接続の作成」を参照してください。
JMX クライアントが単一の MBean サーバを介してカスタム MBean、WebLogic Server MBean、および JVM のプラットフォーム MBean をモニタできるようにする必要がある場合、実行時 MBean サーバをプラットフォーム MBean サーバとしてコンフィグレーションできます。その場合、以下のことに留意してください。
java.lang.management.ManagementFactory.getPlatformMBeanServer()
が返す MBeanServer
インタフェースを介してすべての MBean にアクセスできます。警告 : このローカル アクセスでは、認可されたユーザのみが WebLogic Server MBean にアクセスできるようにする WebLogic Server のセキュリティ チェックがありません。JVM 内で実行されているすべてのアプリケーションが、実行時 MBean サーバ/JDK プラットフォーム MBean サーバの任意の WebLogic Server MBean にアクセスできます。JVM 内で実行されているアプリケーションを制御または信頼できない場合は、このコンフィグレーションを使用しないでください。
プラットフォーム MBean サーバへのリモート アクセスは、標準 JDK 1.5 セキュリティ機能 (http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#remote) によってのみ保護できます。WebLogic Server 実行時 MBean サーバをプラットフォーム MBean サーバとしてコンフィグレーションした場合、プラットフォーム MBean サーバへのリモート アクセスを有効にすると WebLogic Server MBean へのアクセス パスが作成されます。このアクセス パスは、WebLogic Server セキュリティ フレームワークでは保護されません。
WebLogic 実行時 MBean サーバを JDK プラットフォーム MBean サーバとしてコンフィグレーションするには、WebLogic JMXMBean
PlatformMBeanServerEnabled
属性を true に設定して、ドメイン内のサーバを再起動します。『WebLogic Server MBean リファレンス』の「JMXMBean
」を参照してください。
EJB、Web アプリケーションのサーブレット、またはデプロイされているその他のモジュール用の MBean を作成し、その MBean をアプリケーションのデプロイと同時に使用できるようにする場合、デプロイメント サービスからの通知をリスンします。アプリケーションをデプロイ (およびデプロイ済みのアプリケーションが存在するサーバを起動) するときに、WebLogic Server デプロイメント サービスはデプロイメント プロセスの特定の段階で通知を送信します。アプリケーションがデプロイされたことを示す通知を受信したら、MBean を作成および登録できます。
ApplicationLifecycleListener
でデプロイメント通知をリスンするには、以下の 2 つの手順を行います。
weblogic.application.ApplicationLifecycleListener
の拡張クラスを作成します。次に、MBean を作成して MBean サーバに登録するための ApplicationLifecycleListener.postStart
メソッドを実装します。このクラスは、デプロイメント サービスからの postStart
通知の受信後に postStart()
メソッドを呼び出します。『WebLogic Server アプリケーションの開発』の「Programming Application Lifecycle Events」を参照してください。この方法の例については、MedRec サンプル サーバを参照してください。
MBean がその親アプリケーションのライフサイクルを共有するようにするための最も簡単な方法は、BEA の ApplicationLifecycleListener
を使用することです。独自の WebLogic Server クラスとデプロイメント記述子要素を使用せずにサーブレットまたは EJB を管理する場合、以下のことを実行します。
javax.servlet.Filter
をコンフィグレーションします。J2SE 5.0 API 仕様の「Filter
」を参照してください。javax.ejb.EntityBean.ejbActivate()
メソッドを実装します。そのインスタンスが単一の MBean インスタンスを共有するセッション EJB の場合、存在しない場合にのみ MBean を作成および登録するロジックを組み込みます。J2SE 5.0 API 仕様の「EntityBean
」を参照してください。MBean の作成方法に関係なく、アプリケーションがアンデプロイされたことを伝えるデプロイメント通知を受信したときに MBean の登録を解除することをお勧めします。このようにしない場合、メモリ リークが発生する可能性があります。
ApplicationLifecycleListener
の拡張クラスを作成する場合、ApplicationLifecycleListener.preStop
メソッドを実装して MBean の登録を解除できます。
任意のタイプの EJB (セッション、エンティティ、メッセージ) またはサーブレットの管理属性と管理処理をエクスポーズする場合、管理属性と管理処理を独立した委託クラスに実装して、EJB またはサーブレット実装クラスがビジネス ロジックだけで構成され、そのビジネス インタフェースがビジネス ロジックだけを表すようにすることをお勧めします。図 3-1 を参照してください。
図 3-1 では、EJB のビジネス メソッドは、そのデータを委託クラスにプッシュします。たとえば、特定のビジネス メソッドが呼び出されるたびに、そのメソッドは委託クラスのカウンタを増分し、MBean インタフェースはカウンタ値を属性としてエクスポーズします。この方法の例については、MedRec サンプル サーバを参照してください。
このようにビジネス ロジックを管理ロジックから分離した場合、特に委託クラスのカウンタが頻繁に増分されるような条件では、ロジックを同じクラスに組み込んだ場合より効率が悪くなる可能性があります。しかし、実際には、ほとんどの JVM はメソッド呼び出しを最適化することによって効率の低下をごくわずかなものにとどめます。
使用するアプリケーションでこのわずかな違いを許容できない場合、EJB のビジネス クラスに管理値を組み込み、JMX クライアントからの要求時に委託クラスがその値を取得できるようにします。
リモート JMX クライアントがカスタム MBean にアクセスする場合、MBean 属性のデータ型と処理が返すデータ型を javax.management.openmbean.OpenType
に定義したデータ型に制限することをお勧めします。すべての JVM はこれらの基本型にアクセスできます。J2SE 5.0 API 仕様の「OpenType
」を参照してください。
MBean がその他のデータ型をエクスポーズする場合、それらのデータ型はシリアライズ可能でなければならず、リモート JMX クライアントのクラス パスにそれらのデータ型が存在しなければなりません。
MBean は、通知を送信するたびにメモリとネットワーク リソースを使用します。MBean 属性の値が頻繁に変更される場合、このようなメモリとリソースの利用は望ましくありません。
属性が変更されるたびに通知を送信するように MBean をコンフィグレーションする代わりに、モニタ MBean を使用してカスタム MBean を定期的にポーリングすることによって、属性が変更されたかどうかを調べることをお勧めします。モニタ MBean をコンフィグレーションすると、属性が特定の方法で変更された場合、または特定のしきい値に達した場合にのみ通知を送信できます。
詳細については、『JMX によるカスタム管理ユーティリティの開発』の「ベスト プラクティス : 直接的なリスンとモニタ」を参照してください。
BEA のベスト プラクティスの他に、以下のことを考慮してください。
たとえば、サーブレットが複数のヘルパー クラスを使用し、1 つの MBean でサーブレットを表す場合、各ヘルパー クラスはその管理データを 1 つの MBean 実装クラスにプッシュします。
選択する構成は、複雑な管理アーキテクチャの維持の難しさとは対照的に、システム管理者または運営スタッフに提供する MBean の数によって決まります。
APP-INF
ディレクトリにパッケージ化した場合、アプリケーションの他のすべてのクラスがそれらにアクセスできます。管理クラスをモジュールのアーカイブ ファイルにパッケージ化した場合、それらにアクセスできるのはモジュールだけです。たとえば、あるアプリケーションに複数の Web アプリケーションが含まれており、それぞれに EJB1 というセッション EJB のコピーが存在するとします。1 つの MBean ですべてのアプリケーションのセッション EJB のコピーに関する情報を収集する場合、MBean のクラスを APP-INF
ディレクトリにパッケージ化する必要があります。Web アプリケーションの EJB のコピーがそれぞれ MBean のコピーを保持するように設定する場合、MBean のクラスを EJB の JAR ファイルにパッケージ化します。クラスを EJB の JAR にパッケージ化した場合、JAR を Web アプリケーションにコピーするときに MBean クラスを各 Web アプリケーションに配布します。
![]() ![]() |
![]() |
![]() |