|
以下の節では、JMX を使用して WebLogic Server ドメインのコンフィグレーションを管理する方法について説明します。
WebLogic Server ドメインの変更および変更のアクティブ化のプロセスを理解するには、『ドメインのコンフィグレーションについて』の「コンフィグレーションの変更の管理」を参照してください。
MBean 属性に対するすべての編集は編集セッションのコンテキスト内で行われます。各 WebLogic Server ドメインの内部では、一度に 1 つの編集セッションのみをアクティブにすることができます。ユーザが編集セッションを開始すると、WebLogic Server は他のユーザが保留中のコンフィグレーション MBean 階層にアクセスできないようにロックします。「ロックの管理」を参照してください。
MBean 属性の変更や新しい MBean の作成を行うと、保留中のコンフィグレーション MBean のメモリ内の階層が更新されます。これらの変更を保存する前に編集セッションを終了すると、保存されていない変更は破棄されます。
メモリ内の階層に対して十分な変更を行ったら、その変更内容をドメインの保留中のコンフィグレーション ファイルに保存します。保存した変更は、アクティブ化されるか明示的に元に戻されるまで、保留中のコンフィグレーション ファイル内に保持されます。保存した変更をアクティブ化する前に編集セッションを終了した場合は、以降の編集セッションで、本人または他のだれかがその変更をアクティブ化できます。
アクティブ化する前に繰り返し変更を行って保存することができます。たとえば、サーバを作成して保存できます。その後で、新しいサーバのリスン ポートとリスン アドレスをコンフィグレーションしてその変更を保存できます。このようにコードを編集すると、エラーの修正や検証がしやすくなります。
変更をアクティブ化すると、WebLogic Server は保存された保留中のコンフィグレーション ファイルをドメイン内のすべてのサーバにコピーします。各サーバは変更を評価して、その変更を使用できるかどうかを示します。使用できる場合、各サーバはアクティブなコンフィグレーション ファイルと、コンフィグレーション MBean のメモリ内の階層を更新します。
MBean の編集および編集のアクティブ化の例については、「例 : 管理ポートの変更」を参照してください。
接続は java.management.MBeanServerConnection 型のオブジェクトを返します。
「MBean サーバへのリモート接続の作成」を参照してください。
ConfigurationManagerMBean のオブジェクト名を取得します。
ConfigurationManagerMBean は、編集セッションの開始および停止、コンフィグレーションに対する変更の保存、取り消し、およびアクティブ化を行うためのメソッドを提供します (『WebLogic Server MBean リファレンス』の「ConfigurationManagerMBean」を参照)。
各ドメインは ConfigurationManagerMBean のインスタンスを 1 つだけ持ち、そのインスタンスは EditServiceMBean ConfigurationManager 属性に格納されます。EditServiceMBean はすべての編集処理のエントリ ポイントです。簡単な固定のオブジェクト名を持ち、編集 MBean サーバ内の他のすべての MBean にアクセスするための属性とオペレーションが含まれています。
ConfigurationManagerMBean オブジェクト名を取得するには、次のメソッドを使用します。MBeanServerConnection.getAttribute(
ObjectName object-name, String attribute)各要素の説明は次のとおりです。
編集セッションを開始するには、ConfigurationManagerMBean startEdit(int waitTime, int timeout) オペレーションを呼び出します。
各要素の説明は次のとおりです。
waitTime - 編集 MBean 階層でロックを確立するために、ConfigurationManagerMBean が待機するミリ秒数を指定する。管理者特権を持たない限り、他の編集が進行中の場合にロックを確立することはできません (「ロックの管理」を参照)。timeout - 編集セッションを完了しなければならないミリ秒数を指定する。編集を保存またはアクティブ化する前に時間切れになると、保存されていない変更はすべて破棄されます。
startEdit オペレーションは次のいずれかを返します。
weblogic.management.mbeanservers.edit.EditTimedOutException を送出する。DomainMBean のオブジェクト名を返す。これが編集 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) です。『WebLogic Server MBean リファレンス』では、各 MBean のファクトリ メソッドの場所が説明されています (「ServerMBean」を参照)。
ConfigurationManagerMBean validate() オペレーションを呼び出して、各手順の後に変更を検証することを検討してください。
validate メソッドでは、未保存のすべての変更が、MBean 属性間の依存関係に関する要件を満たしているかどうかを検証し、1 つの属性の値が設定されただけでは行うことのできないその他のチェックを実施します。
検証エラーが見つかった場合、validate() オペレーションは weblogic.management.mbeanservers.edit.ValidationException 型の例外を送出します。「編集処理によって送出される例外の型」を参照してください。
ConfigurationManagerMBean save() オペレーションを呼び出して変更を保存します。
保存した変更をドメイン内でアクティブ化するには、次の手順に従います。
ConfigurationManagerMBean activate(long timeout) オペレーションを呼び出します。timeout には、オペレーションが完了しなければならないミリ秒数を指定します。
activate オペレーションは ActivationTaskMBean のインスタンスのオブジェクト名を返します。このインスタンスにはアクティブ化リクエストに関する情報が含まれています。「変更の表示と取り消し」を参照してください。
activate オペレーションが成功するかタイムアウトすると、編集可能な MBean 階層でロックが解放されます。
JMXConnector.close() を呼び出して、MBean サーバへの接続を閉じます。
コード リスト 5-1 のサンプル コードでは、ドメインの Administration Console にアクセスするために使用するコンテキスト パスを変更しています。この動作は DomainMBean ConsoleContextPath 属性で定義されます。
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();
}
/**
* 編集セッションを開始する
*/
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 Admin 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 で例外をラップします (J2SE 5.0 API 仕様の MBeanException を参照)。
以下の節では、編集セッション中に行った変更の操作について説明します。
WebLogic Server は javax.management.openmbean.CompositeType 型の Change オブジェクトに変更を記述します。J2SE 5.0 API 仕様の CompositeType を参照してください。
JMX を通じて、現在のサーバ セッション中にのみ発生したドメインのコンフィグレーションの変更に関する情報にアクセスできます。WebLogic Server はコンフィグレーション ファイルのアーカイブを保持しますが、JMX を通じてアーカイブされたデータを利用したり、アーカイブのバージョンを比較したりはできません。
MBean 属性を変更するたびに、WebLogic Server はその変更に関する情報が含まれる Change オブジェクトを作成します。変更を保存するまでは、これらのオブジェクトに ConfigurationManagerMBean Changes 属性からアクセスできます。『WebLogic Server MBean リファレンス』の「ConfigurationManagerMBean Changes」を参照してください。
編集セッションを終了するときに、保存されていない変更は破棄されます。
ConfigurationManagerMBean Changes 属性の値を取得して、その出力を Object[] 型の変数に割り当てます。Object.toString() を呼び出して、変更の説明を出力します。
Change は javax.management.openmbean.CompositeType なので、配列内の各項目を CompositeType としてキャストし、変更に対して CompositeType のメソッドを呼び出すこともできます。J2SE 5.0 API 仕様の CompositeType を参照してください。
コード リスト 5-2 のコードでは、保存されていない変更を表示するメソッドを作成します。呼び出し側メソッドは編集 MBean サーバとの接続をすでに確立しているものとします。
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 オブジェクトが格納されます (保存されてまだアクティブ化されていない変更のみを格納する属性はありません)。『WebLogic Server MBean リファレンス』の「ConfigurationManagerMBean UnactivatedChanges」を参照してください。
現在の編集セッション中に保存してまだアクティブ化していない変更、または以前の編集セッションで保存されてまだアクティブ化されていない変更を表示するには、次の手順に従います。
ConfigurationManagerMBean UnactivatedChanges 属性の値を取得して、その出力を Object[] 型の変数に割り当てます。Object.toString() を呼び出して、変更の説明を出力します。
Change は javax.management.openmbean.CompositeType なので、配列内の各項目を CompositeType としてキャストし、変更に対して CompositeType のメソッドを呼び出すこともできます。J2SE 5.0 API 仕様の CompositeType を参照してください。
コード リスト 5-3 のコードでは、アクティブ化されていない変更を表示するメソッドを作成します。呼び出し側メソッドは編集 MBean サーバとの接続をすでに確立しているものとします。
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 のメソッドを呼び出すこともできます。J2SE 5.0 API 仕様の CompositeType を参照してください。
コード リスト 5-4 のコードでは、現在の編集セッションでアクティブ化されたすべての変更を表示するメソッドを作成します。呼び出し側メソッドは編集 MBean サーバとの接続をすでに確立しているものとします。
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 つのオペレーションがあります。
変更を取り消すには、編集セッションを開始して、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 値の定数を定義します。『WebLogic Server MBean リファレンス』の「ActivationTaskMBean」を参照してください。
現在のアクティブ化タスクのステータスを表示するには、次の手順に従います。
activate オペレーションが返す ActivationTaskMBean は 1 つのアクティブ化タスクのみを表します。管理サーバは、ユーザがパージするまでこの ActivationTaskMBean をメモリ内に保持します (「完了したアクティブ化タスクのメモリからのパージ」を参照)。パージしないと、アクティブ化タスクの数は ConfigurationManagerMBean CompletedActivationTasksCount 属性の値を超えます。
現在メモリに格納されているすべての ActivationTaskMBean インスタンスにアクセスするには、次の手順に従います (コード リスト 5-5 を参照)。
ConfigurationManagerMBean CompletedActivationTasks 属性の値を取得して、その出力を Object[] 型の変数に割り当てます。ActivationTaskMBean の属性 (User や State など) の値を取得して出力します。
『WebLogic Server MBean リファレンス』の「ActivationTaskMBean」を参照してください。
Changes 属性の値を取得します。Object.toString() を呼び出して、Change オブジェクトの値を出力します。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);
たとえば、Administration Console を使用して編集セッションを開始し、その後で WebLogic Scripting Tool (WLST) を使用して同じユーザ ID で編集セッションを開始することができます。WLST のセッションによって Administration Console のセッションのロックは解除されます。
別のプロセスが同じユーザ ID で編集セッションを開始しないようにするには、startEdit オペレーションに boolean の値 true を渡して、排他的なロックを取得します。『WebLogic Server MBean リファレンス』の「startEdit(waitTimeInMillis, timeOutInMillis, exclusive)」を参照してください。
ロックが解除されると、保存されていないすべての変更は失われます。
編集するコードを複数の try-catch ブロックに整理することをお勧めします。そのようにすると、特定の型のエラーを捕捉して適切に対応できます。たとえば、編集が無効な場合に編集セッション全体を破棄するのではなく、その変更を保存して、例外を送出し、無効な変更をアクティブ化せずに終了することができます。
JMX エージェントはすべての例外を javax.management.MBeanException 型の汎用的な例外でラップします。JMX クライアントは MBeanException.getTargetException() を使用して、ラップされた例外のラップを解除することができます。
以下のような構成を利用することを検討してください (コード リスト 5-6 の擬似コードを参照)。
この try ブロックの後、MBeanException 内にラップされた以下の型の例外ごとに 1 つの catch ブロック。
EditTimedOutException
ConfigurationManagerMBean startEdit() オペレーションが指定された時間内にロックを取得できない場合、この例外が送出されます。
NotEditorException
編集セッションがタイムアウトするか、管理者がユーザの編集セッションを取り消した場合、この例外が送出されます (「ロックの管理」を参照)。
ValidationException
誤ったデータ型、許容される範囲外の値、指定された値ではない値、他の属性との依存関係に適合しない値などを MBean に設定した場合、この例外が送出されます。
ValidationException を処理するコードの内部には、検証エラーを修正する、または ConfigurationManagerMBean stopEdit() オペレーションを呼び出して編集セッションを停止する try ブロックを入れます。try ブロックで編集セッションを停止する場合、その catch ブロックでは NotEditorException を無視する必要があります。この例外は、保留中のコンフィグレーション MBean 階層でのロックを失ったことを表しますが、ここでは変更を破棄してロックを解放しようとしているので、この例外が送出されてもエラー状態ではありません。
ConfigurationManager activate(long timeout) オペレーションは ActivationTaskMBean のインスタンスを返します。このインスタンスには、アクティブ化タスクに関する情報が格納されています。activate() のタイムアウト期間を 1 分間に設定して、その後で ActivationTaskMBean State の値をチェックすることをお勧めします。
State に定数 STATE_COMMITTED が含まれている場合、変更はドメインで正常にアクティブ化されたことになります。この時点で return 文を使用して編集作業を終了できます。アクティブ化タスクが成功すると、startEdit() で作成したロックが解放されます。
State に別の値が含まれている場合、アクティブ化は activate(long timeout) で指定したタイムアウト期間中に成功しなかったことになります。ActivationTaskMBean Error 属性の値を取得すると原因を見つけられます。
この try ブロックの後、ラップされた以下の型の例外を捕捉する 1 つの catch ブロック。
クラスがアクティブ化の try ブロックで終了 (return) しない場合、アクティブ化タスクは成功しなかったことになります。保存されている変更が、将来の試行でアクティブ化されないようにするには、ConfigurationManagerMBean undoUnactivatedChanges() オペレーションを呼び出します。
そうしない場合、保存されている変更は保留中のコンフィグレーション ファイルに保持されます。次回、あるユーザが保存した変更をアクティブ化しようとすると、WebLogic Server はそのユーザが保存した変更と一緒に、保存されている変更をアクティブ化しようとします。
この try ブロックの後、ラップされた以下の型の例外を無視する 1 つの catch ブロック。
アクティブ化タスクが失敗した場合に変更を破棄する場合は、元のタイムアウト期間が経過するのを待つ必要はありません。編集を直ちに停止できます。
この try ブロックの後、以下の型の例外を無視する 1 つの catch ブロック。
ActivationTaskMBean Error 属性に格納されている例外を送出する。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 を参照)。
weblogic.management.EncryptionHelper.encrypt( byte[]) メソッドに渡し、その戻り値を MBeanServerConnection.setAttribute メソッドに渡します。
暗号化された配列を変数には割り当てないでください。変数に割り当てると、ガベージ コレクションが行われてメモリが再割り当てされるまで、暗号化されていないバイト配列がメモリ内に保持されます。
weblogic.management.EncryptionHelper.clear() メソッドを使用して、元のバイト配列を消去します。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 の対応する暗号化されていない値のゲッター メソッドを使用できます。このゲッターはパスワードを復号化して String にコピーします。ガベージ コレクションが行われてメモリが再割り当てされるまで、String はメモリから消去されません。 |
|