Oracle® Fusion Middleware Oracle WebLogic Server JMX によるカスタム管理ユーティリティの開発 11g リリース 1 (10.3.1) B55537-01 |
|
戻る |
次へ |
以下の節では、JMX を使用して WebLogic Server ドメインのコンフィグレーションを管理する方法について説明します。
WebLogic Server ドメインの変更および変更のアクティブ化のプロセスを理解するには、『Oracle Fusion Middleware Oracle WebLogic Server ドメインのコンフィグレーションについて』の「コンフィグレーションの変更の管理」を参照してください。
MBean 属性を編集するには、次の手順に従います。
編集セッションの開始
MBean 属性に対するすべての編集は編集セッションのコンテキスト内で行われます。各 WebLogic Server ドメインの内部では、一度に 1 つの編集セッションのみをアクティブにすることができます。ユーザが編集セッションを開始すると、WebLogic Server は他のユーザが保留中のコンフィグレーション MBean 階層にアクセスできないようにロックします。「ロックの管理」を参照してください。
MBean 属性の変更または新しい MBean 作成
MBean 属性の変更や新しい MBean の作成を行うと、保留中のコンフィグレーション MBean のメモリ内の階層が更新されます。これらの変更を保存する前に編集セッションを終了すると、保存されていない変更は破棄されます。
保留中のコンフィグレーション ファイルへの変更の保存
メモリ内の階層に対して十分な変更を行ったら、その変更内容をドメインの保留中のコンフィグレーション ファイルに保存します。保存した変更は、アクティブ化されるか明示的に元に戻されるまで、保留中のコンフィグレーション ファイル内に保持されます。保存した変更をアクティブ化する前に編集セッションを終了した場合は、以降の編集セッションで、本人または他のだれかがその変更をアクティブ化できます。
アクティブ化する前に繰り返し変更を行って保存することができます。たとえば、サーバを作成して保存できます。その後で、新しいサーバのリスン ポートとリスン アドレスをコンフィグレーションしてその変更を保存できます。このようにコードを編集すると、エラーの修正や検証がしやすくなります。
保存した変更のアクティブ化
変更をアクティブ化すると、WebLogic Server は保存された保留中のコンフィグレーション ファイルをドメイン内のすべてのサーバにコピーします。各サーバは変更を評価して、その変更を使用できるかどうかを示します。使用できる場合、各サーバはアクティブなコンフィグレーション ファイルと、コンフィグレーション MBean のメモリ内の階層を更新します。
サーバの再起動を必要とする変更内容で更新されたサーバ インスタンスがあれば、再起動します。
MBean の編集および編集のアクティブ化の例については、「例 : 管理ポートの変更」を参照してください。
編集セッションを開始するには、次の手順に従います。
編集 MBean サーバへの接続を開始します。
接続は java.management.MBeanServerConnection
型のオブジェクトを返します。
「MBean サーバへのリモート接続の作成」を参照してください。
ConfigurationManagerMBean
のオブジェクト名を取得します。
ConfigurationManagerMBean
は、編集セッションの開始および停止、コンフィグレーションに対する変更の保存、取り消し、およびアクティブ化を行うためのメソッドを提供します (『Oracle Fusion Middleware Oracle WebLogic Server MBean リファレンス』の「ConfigurationManagerMBean」を参照してください。)
各ドメインは ConfigurationManagerMBean
のインスタンスを 1 つだけ持ち、そのインスタンスは EditServiceMBean
ConfigurationManager
属性に格納されます。EditServiceMBean
はすべての編集処理のエントリ ポイントです。簡単な固定のオブジェクト名を持ち、編集 MBean サーバ内の他のすべての MBean にアクセスするための属性とオペレーションが含まれています。
ConfigurationManagerMBean
オブジェクト名を取得するには、次のメソッドを使用します。
MBeanServerConnection.getAttribute(
ObjectName object-name, String
attribute)
各要素の説明は次のとおりです。
object-name
リテラル "com.bea:Name=EditService,Type=weblogic.management.mbeanservers.edit.EditServiceMBean"
。これは EditServiceMBean
のオブジェクト名です。
attribute
リテラル "ConfigurationManager"
。これは ConfigurationManagerMBean
を含む EditServiceMBean
の属性の名前です。
編集セッションの開始
編集セッションを開始するには、ConfigurationManagerMBean
startEdit(int
waitTime
, int
timeout
)
オペレーションを呼び出します。
各要素の説明は次のとおりです。
waitTime
- 編集 MBean 階層でロックを確立するために、ConfigurationManagerMBean
が待機するミリ秒数を指定する。管理者特権を持たない限り、他の編集が進行中の場合にロックを確立することはできません (「ロックの管理」を参照してください) 。
timeout
- 編集セッションを完了しなければならないミリ秒数を指定する。編集を保存またはアクティブ化する前に時間切れになると、保存されていない変更はすべて破棄されます。
startEdit
オペレーションは次のいずれかを返します。
指定した時間内に編集ツリーでロックを確立できない場合は、weblogic.management.mbeanservers.edit.EditTimedOutException
を送出する。
編集ツリーを正常にロックした場合は、DomainMBean
のオブジェクト名を返す。これが編集 MBean 階層のルートになります。
既存の MBean の属性値を変更する、新しい MBean を作成する、または MBean を削除するには、次の手順に従います。
編集ツリーの階層を移動して、編集する MBean のオブジェクト名を取得します。MBean を作成または削除するには、適切なファクトリ メソッドを含む MBean のオブジェクト名を取得します。
「MBean サーバへのリモート接続の作成」を参照してください。
MBean 属性の値を変更するには、MBeanServerConnection
.setAttribute(
object-name
,
attribute
)
メソッドを呼び出します。各要素の説明は次のとおりです。
object-name
- 編集する MBean のオブジェクト名。
attribute
- javax.management.Attribute
オブジェクト。変更する MBean 属性の名前とその新しい値が格納されます。
MBean を作成するには、その MBean の作成メソッドを呼び出します。たとえば、ServerMBean
のインスタンスを作成するファクトリ メソッドは、DomainMBean
の createServer(String
name
)
です。『Oracle Fusion Middleware Oracle WebLogic Server MBean リファレンス』では、各 MBean のファクトリ メソッドの場所が説明されています。 (「ServerMBean」を参照してください。)
(省略可能) 複数の手順に分けて編集を行う場合は、ConfigurationManagerMBean
validate()
オペレーションを呼び出して、各手順の後に変更を検証することを検討してください。
validate メソッドでは、未保存のすべての変更が、MBean 属性間の依存関係に関する要件を満たしているかどうかを検証し、1 つの属性の値が設定されただけでは行うことのできないその他のチェックを実施します。
検証エラーが見つかった場合、validate()
オペレーションは weblogic.management.mbeanservers.edit.ValidationException
型の例外を送出します。「編集処理によって送出される例外の型」を参照してください。
save()
オペレーションも保存前に変更を検証するので、ここでの検証は省略可能です。
ConfigurationManagerMBean
save()
オペレーションを呼び出して変更を保存します。
保存した変更をドメイン内でアクティブ化するには、次の手順に従います。
ConfigurationManagerMBean
activate(long
timeout
)
オペレーションを呼び出します。timeout
には、オペレーションが完了しなければならないミリ秒数を指定します。
activate
オペレーションは ActivationTaskMBean
のインスタンスのオブジェクト名を返します。このインスタンスにはアクティブ化リクエストに関する情報が含まれています。「変更の表示と取り消し」を参照してください。
activate
オペレーションが成功するかタイムアウトすると、編集可能な MBean 階層でロックが解放されます。
JMXConnector.close()
を呼び出して、MBean サーバへの接続を閉じます。
コード リスト 5-1 のサンプル コードでは、ドメインの Administration Console にアクセスするために使用するコンテキスト パスを変更しています。この動作は DomainMBean
ConsoleContextPath
属性で定義されます。
サンプル コードに関する以下の点に留意してください。
クラスから編集 MBean サーバへの接続方法については、「MBean サーバへのリモート接続の作成」を参照。
学習用にコードを簡略化するため、コード リスト 5-1 の例外処理は最小限のものになっている。「ベスト プラクティス : 編集と例外処理の推奨パターン」を参照してください。
コード リスト 5-1 例 : Administration Console のコンテキスト パスの変更
import java.io.IOException; import java.net.MalformedURLException; import java.util.Hashtable; import javax.management.Attribute; import javax.management.MBeanServerConnection; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import javax.naming.Context; public class EditWLSMBeans { private static MBeanServerConnection connection; private static JMXConnector connector; private static final ObjectName service; // クラス内で使用できるように // EditServiceMBean のオブジェクト名を初期化する。 static { try { service = new ObjectName( "com.bea:Name=EditService,Type=weblogic.management.mbeanservers. edit.EditServiceMBean"); } catch (MalformedObjectNameException e) { throw new AssertionError(e.getMessage()); } } /** * ---------------------------------------------------------- * 編集セッションを開始するメソッド。 * 注意 : 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.edit"; 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(); } /** * Start an edit session. */ public ObjectName startEditSession() throws Exception { // ConfigurationManagerMBean のオブジェクト名を取得する。 ObjectName cfgMgr = (ObjectName) connection.getAttribute(service, "ConfigurationManager"); // MBeanServerConnection に // ConfigurationManager.startEdit(int waitTime int timeout) を呼び出すように指示する。 // startEdit オペレーションは // DomainMBean へのハンドルを返す。それが編集階層のルートになる。 ObjectName domainConfigRoot = (ObjectName) connection.invoke(cfgMgr,"startEdit", new Object[] { new Integer(60000), new Integer(120000) }, new String[] { "java.lang.Integer", "java.lang.Integer" }); if (domainConfigRoot == null) { // ロックを取得できなかった場合 throw new Exception("Somebody else is editing already"); } return domainConfigRoot; /** * ---------------------------------------------------------- * MBean 属性を変更するメソッド。 * ---------------------------------------------------------- */ /** * DomainMBean の ConsoleContextPath 属性を変更する。 */ public void editConsoleContextPath(ObjectName cfgRoot) throws Exception { // 呼び出し側メソッドは DomainMBean のオブジェクト名を渡す。 // このメソッドで必要なのは // DomainMBean の属性値の設定のみ。 Attribute adminport = new Attribute("ConsoleContextPath", new String( "secureConsoleContext")); connection.setAttribute(cfgRoot, adminport); System.out.println("Changed the Administration Console context path to " + "secureConsoleContext"); } /** * ---------------------------------------------------------- * 編集をアクティブ化するメソッド。 * ---------------------------------------------------------- */ public ObjectName activate() throws Exception { // ConfigurationManagerMBean のオブジェクト名を取得する。 ObjectName cfgMgr = (ObjectName) connection.getAttribute(service, "ConfigurationManager"); // MBeanServerConnection に // ConfigurationManager.activate(long timeout) を呼び出すように指示する。 // activate オペレーションは ActivationTaskMBean を返す。 // ActivationTaskMBean を使用して、ドメインでの変更のアクティブ化の // 進行状況を追跡できる。 ObjectName task = (ObjectName) connection.invoke(cfgMgr, "activate", new Object[] { new Long(120000) }, new String[] { "java.lang.Long" }); return task; } public static void main(String[] args) throws Exception { String hostname = args[0]; String portString = args[1]; String username = args[2]; String password = args[3]; EditWLSMBeans ewb = new EditWLSMBeans(); // MBean サーバとの接続を初期化する。 initConnection(hostname, portString, username, password); // コンフィグレーション マネージャのオブジェクト名を取得する。 ObjectName cfgMgr = (ObjectName) connection.getAttribute(service, "ConfigurationManager"); // 編集セッションを開始する。 ObjectName cfgRoot = ewb.startEditSession(); // サーバ ログ MBean を編集する。 ewb.editConsoleContextPath(cfgRoot); // 保存してアクティブ化する。 connection.invoke(cfgMgr, "save", null, null); ewb.activate(); // MBean サーバとの接続を閉じる。 connector.close(); } }
表 5-1 では、編集処理中に WebLogic Server が送出する可能性があるすべての例外の型について説明します。WebLogic Server がこのような例外を送出すると、MBean サーバは javax.management.MBeanException
で例外をラップします。((http://java.sun.com/javase/6/docs/api/javax/management/MBeanException.html
) で J2SE 6.0 API 仕様の MBeanException
を参照してください。)
以下の節では、編集セッション中に行った変更の操作について説明します。
WebLogic Server は javax.management.openmbean.CompositeType
型の Change
オブジェクトに変更を記述します。(http://java.sun.com/javase/6/docs/api/javax/management/openmbean/CompositeType.html
) で J2SE 6.0 API 仕様 の CompositeType
を参照してください。
JMX を通じて、現在のサーバ セッション中にのみ発生したドメインのコンフィグレーションの変更に関する情報にアクセスできます。WebLogic Server はコンフィグレーション ファイルのアーカイブを保持しますが、JMX を通じてアーカイブされたデータを利用したり、アーカイブのバージョンを比較したりはできません。
MBean 属性を変更するたびに、WebLogic Server はその変更に関する情報が含まれる Change
オブジェクトを作成します。変更を保存するまでは、これらのオブジェクトに ConfigurationManagerMBean
Changes
属性からアクセスできます。『Oracle Fusion Middleware Oracle WebLogic Server MBean リファレンス』の「ConfigurationManagerMBean」を参照してください。
編集セッションを終了するときに、保存されていない変更は破棄されます。
保存されていない変更を表示するには、次の手順に従います。
編集セッションを開始して、少なくとも 1 つの MBean 属性を変更します。
ConfigurationManagerMBean
Changes
属性の値を取得して、その出力を Object[]
型の変数に割り当てます。
配列内のオブジェクトごとに Object.toString()
を呼び出して、変更の説明を出力します。
Change
は javax.management.openmbean.CompositeType
なので、配列内の各項目を CompositeType
としてキャストし、変更に対して CompositeType
のメソッドを呼び出すこともできます。(http://java.sun.com/javase/6/docs/api/javax/management/openmbean/CompositeType.html
) で J2SE 6.0 API 仕様 の CompositeType
を参照してください。
コード リスト 5-2 のコードでは、保存されていない変更を表示するメソッドを作成します。呼び出し側メソッドは編集 MBean サーバとの接続をすでに確立しているものとします。
コード リスト 5-2 保存されていない変更を表示するサンプル メソッド
public void listUnsaved() throws Exception { ObjectName cfgMgr = (ObjectName) connection.getAttribute(service, "ConfigurationManager"); Object[] list = (Object[])connection.getAttribute(cfgMgr, "Changes"); int length = (int) list.length; for (int i = 0; i < length; i++) { System.out.println("Unsaved change: " + list[i].toString()); } }
変更が保存されると、WebLogic Server は保留中のコンフィグレーション ファイルで変更を永続化します。編集セッションを開始したユーザが ConfigurationManagerMBean
undoUnactivatedChanges()
オペレーション (アクティブ化されていない変更を保留中ファイルから元に戻す) を呼び出さない限り、複数の編集セッションにわたる場合でも、変更は保留中のコンフィグレーション ファイルに保持されます。
ConfigurationManagerMBean
UnactivatedChanges
属性には、保存されていない変更と、保存されてまだアクティブ化されていない変更の両方の Change
オブジェクトが格納されます (保存されてまだアクティブ化されていない変更のみを格納する属性はありません)。『Oracle Fusion Middleware Oracle WebLogic Server MBean リファレンス』の「ConfigurationManagerMBean Unactivated Changes」を参照してください。
現在の編集セッション中に保存してまだアクティブ化していない変更、または以前の編集セッションで保存されてまだアクティブ化されていない変更を表示するには、次の手順に従います。
編集セッションを開始して、少なくとも 1 つの MBean 属性を変更します。
ConfigurationManagerMBean
UnactivatedChanges
属性の値を取得して、その出力を Object[]
型の変数に割り当てます。
配列内のオブジェクトごとに Object.toString()
を呼び出して、変更の説明を出力します。
Change
は javax.management.openmbean.CompositeType
なので、配列内の各項目を CompositeType
としてキャストし、変更に対して CompositeType
のメソッドを呼び出すこともできます。(http://java.sun.com/javase/6/docs/api/javax/management/openmbean/CompositeType.html
) で J2SE 6.0 API 仕様 の CompositeType
を参照してください。
コード リスト 5-3 のコードでは、アクティブ化されていない変更を表示するメソッドを作成します。呼び出し側メソッドは編集 MBean サーバとの接続をすでに確立しているものとします。
コード リスト 5-3 アクティブ化されていない変更を表示するサンプル メソッド
public void listUnactivated() throws Exception { ObjectName cfgMgr = (ObjectName) connection.getAttribute(service, "ConfigurationManager"); Object[] list = (Object[])connection.getAttribute(cfgMgr, "UnactivatedChanges"); int length = (int) list.length; for (int i = 0; i < length; i++) { System.out.println("Unactivated changes: " + list[i].toString()); } }
変更をアクティブ化すると、WebLogic Server は ActivationTaskMBean
のインスタンスを作成します。このインスタンスには、アクティブ化される変更ごとに 1 つの Change
オブジェクトが格納されます。この ActivationTaskMBean
には、次のいずれかからアクセスできます。
ConfigurationManagerMBean
activate()
メソッド - 現在のアクティブ化タスクを表す ActivationTaskMBean
のオブジェクト名を返します。
ConfigurationManagerMBean
CompletedActivationTasks
属性 - 現在の管理サーバのインスタンス化中に作成されたすべての ActivationTaskMBean
インスタンスのリストが含まれている可能性があります。「メモリに格納されているすべてのアクティブ化タスクの表示」を参照してください。
現在のアクティブ化タスクにある変更のみを表示するには、次の手順に従います。
編集セッションの開始
activate
オペレーションの出力を javax.management.ObjectName
型のインスタンス変数に割り当てます。
ActivationTaskMBean
Changes
属性の値を取得して、その出力を Object[]
型の変数に割り当てます。
配列内のオブジェクトごとに Object.toString()
を呼び出して、変更の説明を出力します。
Change
は javax.management.openmbean.CompositeType
なので、配列内の各項目を CompositeType
としてキャストし、変更に対して CompositeType
のメソッドを呼び出すこともできます。(http://java.sun.com/javase/6/docs/api/javax/management/openmbean/CompositeType.html
) で J2SE 6.0 API 仕様 の CompositeType
を参照してください。
コード リスト 5-4 のコードでは、現在の編集セッションでアクティブ化されたすべての変更を表示するメソッドを作成します。呼び出し側メソッドは編集 MBean サーバとの接続をすでに確立しているものとします。
コード リスト 5-4 現在のアクティブ化タスクにある変更を表示するサンプル メソッド
public void activateAndList() throws Exception { ObjectName cfgMgr = (ObjectName) connection.getAttribute(service, "ConfigurationManager"); ObjectName task = (ObjectName) connection.invoke(cfgMgr, "activate", new Object[] { new Long(120000) }, new String[] { "java.lang.Long" }); Object[] changes = (Object[])connection.getAttribute(task, "Changes"); int i = (int) changes.length; for (int i = 0; i< i; i++) { System.out.println("Changes activated: " + changes[i].toString()); } }
ConfigurationManagerMBean
には、編集セッション中に行われた変更を取り消すための 2 つのオペレーションがあります。
undo
保存されていない変更を元に戻します。
undoUnactivatedChanges
保存されているかどうかに関わらず、まだアクティブ化されていないすべての変更を元に戻します。以前の編集セッションで他のユーザが変更を保存して、その変更をアクティブ化していない場合に、ConfigurationManagerMBean
undoUnactivatedChanges()
オペレーションを呼び出すと、それらの変更も元に戻されます。
このメソッドを呼び出した後、保留中のコンフィグレーション ファイルは、アクティブなサーバが使用している動作中のコンフィグレーション ファイルと同じになります。
変更を取り消すには、編集セッションを開始して、ConfigurationManagerMBean
undo
または undoUnactivatedChanges
オペレーションを呼び出します。
次に例を示します。
connection.invoke(cfgMgr, "undo", null, null);
activate
オペレーションを呼び出すときに WebLogic Server が作成する各 ActivationTaskMBean
では、変更のリストを保持する他に、変更をアクティブ化したユーザ、アクティブ化タスクのステータス、変更がアクティブ化された時刻が記述されます。
管理サーバは ActivationTaskMBean
のインスタンスをメモリ内にのみ保持します。つまり、インスタンスは永続化されず、管理サーバを停止するときに破棄されます。ActivationTaskMBean
インスタンスには Change
オブジェクトのリスト (各オブジェクトは MBean 属性の 1 つの変更を表す) が含まれているため、メモリを大量に使用します。メモリを節約するため、デフォルトでは、管理サーバはごく最近の ActivationTaskMBean
インスタンスしかメモリ内に保持しません。デフォルトを変更するには、ConfigurationManagerMBean
CompletedActivationTasksCount
属性の値を増やします。
以下の節では、ActivationTaskMBean
のインスタンスの操作について説明します。
activate
オペレーションを呼び出すと、WebLogic Server はアクティブ化タスクを表現する ActivationTaskMBean
インスタンスを返します。
ActivationTaskMBean
State
属性は、アクティブ化タスクのステータスを表します。この属性には int
値が格納され、ActivationTaskMBean
は各 int
値の定数を定義します。『Oracle Fusion Middleware Oracle WebLogic Server MBean リファレンス』の「ActivationTaskMBean」を参照してください。
現在のアクティブ化タスクのステータスを表示するには、次の手順に従います。
編集セッションを開始して、少なくとも 1 つの MBean 属性を変更します。
ConfigurationManagerMBean
activate(long timeout)
オペレーションを呼び出して、その出力を ActivationTaskMBean
型の変数に割り当てます。
ActivationTaskMBean
State
属性の値を取得します。
activate
オペレーションが返す ActivationTaskMBean
は 1 つのアクティブ化タスクのみを表します。管理サーバは、ユーザがパージするまでこの ActivationTaskMBean
をメモリ内に保持します (「完了したアクティブ化タスクのメモリからのパージ」を参照)。パージしないと、アクティブ化タスクの数は ConfigurationManagerMBean
CompletedActivationTasksCount
属性の値を超えます。
現在メモリに格納されているすべての ActivationTaskMBean
インスタンスにアクセスするには、次の手順に従います (コード リスト 5-5 を参照してください)。
編集 MBean サーバに接続します (編集セッションを開始する必要はありません)。
ConfigurationManagerMBean
CompletedActivationTasks
属性の値を取得して、その出力を Object[]
型の変数に割り当てます。
(省略可能) 配列内のオブジェクトごとに、ActivationTaskMBean
の属性 (User
や State
など) の値を取得して出力します。
『Oracle Fusion Middleware Oracle WebLogic Server MBean リファレンス』の「ActivationTaskMBean」を参照してください。
(省略可能) 配列内のオブジェクトごとに、Changes
属性の値を取得します。Object.toString()
を呼び出して、Change
オブジェクトの値を出力します。
コード リスト 5-5 メモリ内のすべてのアクティブ化タスクを表示するサンプル メソッド
public void listActivated() throws Exception { ObjectName cfgMgr = (ObjectName) connection.getAttribute(service, "ConfigurationManager"); ObjectName[] list = (ObjectName[])connection.getAttribute(cfgMgr, "CompletedActivationTasks"); System.out.println("Listing completed activation tasks."); int length = (int) list.length; for (int i = 0; i < length; i++) { System.out.println("Activation task " + i); System.out.println("User who started activation: " + connection.getAttribute(list[i], "User")); System.out.println("Task state: " + connection.getAttribute(list[i], "State")); System.out.println("Start time: " + connection.getAttribute(list[i], "StartTime")); Object[] changes = (Object[])connection.getAttribute(list[i], "Changes"); int l = (int) changes.length; for (int y = 0; y < l; y++) { System.out.println("Changes activated: " + changes[y].toString()); } } }
ActivationTaskMBean
インスタンスには Change
オブジェクトのリスト (各オブジェクトは MBean 属性の 1 つの変更を表す) が含まれているため、メモリを大量に使用します。
管理サーバでメモリ不足になった場合は、完了したアクティブ化タスクをメモリからパージできます。その後で ConfigurationManagerMBean
CompletedActivationTasksCount
属性の値を減らします。
完了したアクティブ化タスクをメモリからパージするには、編集 MBean サーバに接続して、ConfigurationManagerMBean
purgeCompletedActivationTasks
オペレーションを呼び出します。
次に例を示します。
connection.invoke(cfgMgr, "purgeCompletedActivationTasks", null, null);
変更によって保留中のコンフィグレーション MBean 階層が矛盾した状態にならないように、一度に 1 人のユーザだけが MBean を編集できます。ユーザが ConfigurationManagerMBean
startEdit
オペレーションを呼び出すと、ConfigurationManagerMBean
は他のユーザが編集セッションを開始できないように (ロック) します。
以下のアクションによってロックが解除されます。
ConfigurationManagerMBean
activate
オペレーションが成功するか、タイムアウトする。
ActivationTaskMBean
waitForTaskCompletion
オペレーションを使用すると、アクティブ化プロセスが完了するまでブロックできます。
ConfigurationManagerMBean
stopEdit
オペレーションが成功する。
他のユーザがロックを取得しているときに、管理者特権を持つユーザが ConfigurationManagerMBean
cancelEdit
オペレーションを呼び出す。
たとえば、connection.invoke(cfgMgr, "cancelEdit", null, null);
あるユーザ ID により編集セッションが開始され、別のプロセスが同じユーザ ID で編集セッションを開始する。
たとえば、Administration Console を使用して編集セッションを開始し、その後で WebLogic Scripting Tool (WLST) を使用して同じユーザ ID で編集セッションを開始することができます。WLST のセッションによって Administration Console のセッションのロックは解除されます。
別のプロセスが同じユーザ ID で編集セッションを開始しないようにするには、startEdit
オペレーションに boolean
の値 true
を渡して、排他的なロックを取得します。『Oracle Fusion Middleware Oracle WebLogic Server MBean リファレンス』の「startEdit(waitTimeInMillis, timeOutInMillis, exclusive)」を参照してください。
ロックが解除されると、保存されていないすべての変更は失われます。
編集するコードを複数の try-catch ブロックに整理することをお勧めします。そのようにすると、特定の型のエラーを捕捉して適切に対応できます。たとえば、編集が無効な場合に編集セッション全体を破棄するのではなく、その変更を保存して、例外を送出し、無効な変更をアクティブ化せずに終了することができます。
JMX エージェントはすべての例外を javax.management.MBeanException
型の汎用的な例外でラップします。JMX クライアントは MBeanException.getTargetException()
を使用して、ラップされた例外のラップを解除することができます。
以下のような構成を利用することを検討してください (コード リスト 5-6 の擬似コードを参照してください) 。
編集 MBean サーバに接続し、編集セッションを開始し、変更を行って保存する try ブロック。
この try ブロックの後、MBeanException
内にラップされた以下の型の例外ごとに 1 つの catch ブロック。
EditTimedOutException
ConfigurationManagerMBean
startEdit()
オペレーションが指定された時間内にロックを取得できない場合、この例外が送出されます。
NotEditorException
編集セッションがタイムアウトするか、管理者がユーザの編集セッションを取り消した場合、この例外が送出されます (「ロックの管理」を参照)。
ValidationException
誤ったデータ型、許容される範囲外の値、指定された値ではない値、他の属性との依存関係に適合しない値などを MBean に設定した場合、この例外が送出されます。
ValidationException
を処理するコードの内部には、検証エラーを修正する、または ConfigurationManagerMBean
stopEdit()
オペレーションを呼び出して編集セッションを停止する try ブロックを入れます。try ブロックで編集セッションを停止する場合、その catch ブロックでは NotEditorException
を無視する必要があります。この例外は、保留中のコンフィグレーション MBean 階層でのロックを失ったことを表しますが、ここでは変更を破棄してロックを解放しようとしているので、この例外が送出されてもエラー状態ではありません。
保存された変更をアクティブ化する try ブロック。
ConfigurationManager
activate(long timeout)
オペレーションは ActivationTaskMBean
のインスタンスを返します。このインスタンスには、アクティブ化タスクに関する情報が格納されています。activate()
のタイムアウト期間を 1 分間に設定して、その後で ActivationTaskMBean
State
の値をチェックすることをお勧めします。
State
に定数 STATE_COMMITTED
が含まれている場合、変更はドメインで正常にアクティブ化されたことになります。この時点で return
文を使用して編集作業を終了できます。アクティブ化タスクが成功すると、startEdit()
で作成したロックが解放されます。
State
に別の値が含まれている場合、アクティブ化は activate(long timeout)
で指定したタイムアウト期間中に成功しなかったことになります。ActivationTaskMBean
Error
属性の値を取得すると原因を見つけられます。
この try ブロックの後、ラップされた以下の型の例外を捕捉する 1 つの catch ブロック。
NotEditorException
変更をアクティブ化するときにこの例外が送出された場合は、編集セッションがタイムアウトしたか管理者によって取り消されたために、変更はアクティブ化されません。
(省略可能) 保存された変更を取り消す try ブロック。
クラスがアクティブ化の try ブロックで終了 (return) しない場合、アクティブ化タスクは成功しなかったことになります。保存されている変更が、将来の試行でアクティブ化されないようにするには、ConfigurationManagerMBean
undoUnactivatedChanges()
オペレーションを呼び出します。
そうしない場合、保存されている変更は保留中のコンフィグレーション ファイルに保持されます。次回、あるユーザが保存した変更をアクティブ化しようとすると、WebLogic Server はそのユーザが保存した変更と一緒に、保存されている変更をアクティブ化しようとします。
この try ブロックの後、ラップされた以下の型の例外を無視する 1 つの catch ブロック。
NotEditorException
編集セッションを停止する try ブロック。
アクティブ化タスクが失敗した場合に変更を破棄する場合は、元のタイムアウト期間が経過するのを待つ必要はありません。編集を直ちに停止できます。
この try ブロックの後、以下の型の例外を無視する 1 つの catch ブロック。
NotEditorException
ActivationTaskMBean
Error
属性に格納されている例外を送出する。
コード リスト 5-6 編集と例外処理のコードの概要
try { //接続を初期化して編集セッションを開始する ... ObjectName domainConfigRoot = (ObjectName) connection.invoke(cfgMgr, "startEdit", new Object[] { new Integer(30000), new Integer(300000) }, new String[] { "java.lang.Integer", "java.lang.Integer" }); // ドメインを変更する ... // 変更内容を保存する connection.invoke(cfgMgr, "save", null, null); } catch (MBeanException e) { Exception targetException = e.getTargetException(); if (targetException instanceof EditTimedOutException) { // ロックを取得できなかった。ユーザに通知する ... throw new MyAppCouldNotStartEditException(e); } if (targetException instanceof NotEditorException) { ... throw new MyAppEditSessionFailed(e); } if (targetException instanceof ValidationException) { ... try { connection.invoke(cfgMgr, "stopEdit", null, null); // ここでのラップされた NotEditorException は、保留中の // コンフィグレーション MBean 階層でロックを失ったことを表す。 // ただし、ここでは変更を破棄してロックを解放しようとしているので、 // この例外が送出されてもエラー状態ではなく、 // 無視することができる } catch (MBeanException e) { Exception targetException = e.getTargetException(); if (targetException instanceof NotEditorException) { //無視する } } throw new MyAppEditChangesInvalid(e); } else { throw MBeanException (e); } } // 保存されている変更をアクティブ化する try { // 変更をアクティブ化する ActivationTaskMBean task = (ObjectName) connection.invoke(cfgMgr, "activate", new Object[] { new Long(60000) }, new String[] { "java.lang.Long" }); // すべてが処理され、終了するのみ。 String status = (String) connection.getAttribute(task, "State"); if (status.equals("4")) return; // アクティブ化エラーがある場合は、ActivationTaskMBean.getError // を使用してエラーに関する情報を取得する failure = connection.getAttribute(task, "Error"); // ラップされた NotEditorException を捕捉した場合は、編集セッションが終了したか、 // 管理者によって取り消されたために、変更はアクティブ化されていない。 // ラップされた例外を送出する。 } catch (MBeanException e) { Exception targetException = e.getTargetException(); if (targetException instanceof NotEditorException) { ... throw new MyAppEditSessionFailed(e); } } // クラスがこれ以降の行を実行するのは、保存された変更のアクティブ化が // 失敗した場合 // 省略可能 : アクティブ化に失敗した場合、保存されている変更を取り消すことができる。// 取り消さない場合は、次にだれかが変更をアクティブ化するときに、 // 保存されている変更もアクティブ化される。 // try { // { // connection.invoke(cfgMgr, "undoUnactivatedChanges", null, null); // catch(MBeanException e) { // Exception targetException = e.getTargetException(); // if (targetException instanceof NotEditorException) { // ... // throw new MyAppEditSessionFailed(e); // } // } // 編集セッションを停止する。 try { connection.invoke(cfgMgr, "stopEdit", null, null); // アクティブ化タスクが失敗した場合に変更を破棄する場合は、 // 元のタイムアウト期間が経過するのを待つ // 必要はありません。編集を直ちに停止し、 // ラップされている NotEditorException を安全に無視できる。 } catch (MBeanException e) { Exception targetException = e.getTargetException(); if (targetException instanceof NotEditorException) { //無視する } } ... // アクティブ化失敗の原因となったエラー // に関する情報を出力する。 throw new MyAppEditSessionFailed(connection.getAttribute(task, "Error"));
権限のないアクセスからパスワードなどの重要なデータを保護するために、WebLogic Server コンフィグレーション MBean のいくつかの属性は暗号化されます。そうした属性の値はドメインの config.xml
ファイルに暗号化された文字列として保持され、メモリ内の値は暗号化されたバイト配列として表されます。暗号化されている属性は、名前が Encrypted
で終わります。たとえば ServerMBean
では、IIOP プロトコルを介したアクセスの保護に使用されるパスワードが DefaultIIOPPasswordEncrypted
という名前の属性としてエクスポーズされます。下位互換性をサポートし、リモートの JMX クライアントが WebLogic Server MBean のパスワードを設定できるようにするため、暗号化される各属性では、値を暗号化して設定するための、安全性がやや低い手段を提供しています。
以下の節では、暗号化された属性の扱い方について説明します。
この方法を使用するには、(コード リスト 5-7 を参照してください) 。
MBean 属性をホストしている同じ WebLogic Server JVM で、バイト配列に値を書き込みます。
バイト配列を weblogic.management.EncryptionHelper.encrypt( byte[])
メソッドに渡し、その戻り値を MBeanServerConnection.setAttribute
メソッドに渡します。
暗号化された配列を変数には割り当てないでください。変数に割り当てると、ガベージ コレクションが行われてメモリが再割り当てされるまで、暗号化されていないバイト配列がメモリ内に保持されます。
weblogic.management.EncryptionHelper.clear()
メソッドを使用して、元のバイト配列を消去します。
コード リスト 5-7 例 : 暗号化された属性の値の設定 (推奨技術)
public void editDefaultIIOPPassword(ObjectName cfgRoot) throws Exception { // DomainMBean から ServerMBean を取得する ObjectName server = (ObjectName) connection.invoke(cfgRoot, "lookupServer", new Object[] { "myserver" }, new String[] { "java.lang.String" }); // 標準入力から新しいパスワードを取得して、バイト配列に割り当てる。 System.out.println("Enter new password and press enter: "); byte userinput[] = new byte[10]; System.in.read(userinput); // バイト配列を暗号化し、暗号化された属性値として // 設定する。 Attribute newpassword = new Attribute("DefaultIIOPPasswordEncrypted", weblogic.management.EncryptionHelper.encrypt(userinput)); connection.setAttribute(server, newpassword); System.out.println("New password is set to: " + connection.getAttribute(server, "DefaultIIOPPasswordEncrypted")); // バイト配列を消去する。 weblogic.management.EncryptionHelper.clear(userinput); }
9.0 より前では、JMX クライアントは暗号化された値を設定するための別の方法を使用していました。JMX クライアントはこの互換性のある方法を引き続き使用できます。また、リモート JMX クライアントから暗号化された値を設定する場合は、この方法のみを使用できます。互換性のある方法では、暗号化されていないパスワードを格納する String
を作成するので、安全性が低くなります。WebLogic Server が String
を暗号化されたバイト配列に変換しても、ガベージ コレクションが行われてメモリが再割り当てされるまで、String
はメモリ内に残ります。
互換性のある方法を使用するには、次の手順に従います。
値を String
に書き込みます。
String
をパラメータとして MBeanServerConnection.setAttribute
メソッドに渡します。ただし、暗号化された属性の値を設定する代わりに、対応する暗号化されていない属性の値を設定します。
WebLogic Server は String
を暗号化されたバイト配列に変換し、それを CustomIdentityKeyStorePassPhraseEncrypted
として設定します (CustomIdentityKeyStorePassPhrase
の値は設定しません)。
たとえば、リモート JMX クライアントから CustomIdentityKeyStorePassPhraseEncrypted
を設定するには、CustomIdentityKeyStorePassPhrase
という属性に対して MBeanServerConnection.setAttribute
を呼び出します。
次に例を示します。
public void editDefaultIIOPPassword(ObjectName cfgRoot, String password) throws Exception { // DomainMBean から ServerMBean を取得する ObjectName server = (ObjectName) connection.invoke(cfgRoot, "lookupServer", new Object[]{"myserver"},new String[]{"java.lang.String"}); Attribute newpassword = new Attribute("DefaultIIOPPassword", "mypassword"); connection.setAttribute(server, newpassword); }
パスワードのバックアップ コピーを作成するには、MBean の暗号化された値のゲッター メソッドを使用して、暗号化されたバイト配列を取得します。次に、バイト配列の値をファイルに書き込みます。WebLogic Server では、暗号化されている値を復号化する API または他のユーティリティは提供していません。
パスワードの値を回復する必要がある場合は、保存した値をバイト配列に読み込んで、それをパラメータとして MBeanServerConnection.setAttribute
メソッドに渡すことができます (「暗号化された属性の値の設定 (推奨技術)」を参照してください) 。
注意 : WebLogic Server ドメインでは独自の暗号化アルゴリズムを使用しているため、パスワードの暗号化されていない値がすべてのドメインで同じ場合でも、ドメインごとに別々にパスワードをバックアップして回復する必要があります。各ドメインで暗号化された同じパスワードをバックアップする代わりに、MBean の対応する暗号化されていない値のゲッター メソッドを使用できます。このゲッターはパスワードを復号化して |