ナビゲーションをスキップ

JMX によるカスタム管理ユーティリティの開発

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

JMX を使用したドメインのコンフィグレーションの管理

以下の節では、JMX を使用して WebLogic Server ドメインのコンフィグレーションを管理する方法について説明します。

WebLogic Server ドメインの変更および変更のアクティブ化のプロセスを理解するには、『ドメインのコンフィグレーションについて』の「コンフィグレーションの変更の管理」を参照してください。

 


MBean 属性の編集 : 主な手順

MBean 属性を編集するには、次の手順に従います。

    すべての編集は編集セッションのコンテキスト内で行われます。各 WebLogic Server ドメインの内部では、一度に 1 つの編集セッションのみをアクティブにすることができます。ユーザが編集セッションを開始すると、WebLogic Server は他のユーザが保留中のコンフィグレーション MBean 階層にアクセスできないようにロックします。「ロックの管理」を参照してください。

    MBean 属性の変更や新しい MBean の作成を行うと、保留中のコンフィグレーション MBean のメモリ内の階層が更新されます。これらの変更を保存する前に編集セッションを終了すると、保存されていない変更は破棄されます。

    メモリ内の階層に対して十分な変更を行ったら、その変更内容をドメインの保留中のコンフィグレーション ファイルに保存します。保存した変更は、アクティブ化されるか明示的に元に戻されるまで、保留中のコンフィグレーション ファイル内に保持されます。保存した変更をアクティブ化する前に編集セッションを終了した場合は、以降の編集セッションで、本人または他のだれかがその変更をアクティブ化できます。

    アクティブ化する前に繰り返し変更を行って保存することができます。たとえば、サーバを作成して保存できます。その後で、新しいサーバのリスン ポートとリスン アドレスをコンフィグレーションしてその変更を保存できます。このようにコードを編集すると、エラーの修正や検証がしやすくなります。

    変更をアクティブ化すると、WebLogic Server は保存された保留中のコンフィグレーション ファイルをドメイン内のすべてのサーバにコピーします。各サーバは変更を評価して、その変更を使用できるかどうかを示します。使用できる場合、各サーバはアクティブなコンフィグレーション ファイルと、コンフィグレーション MBean のメモリ内の階層を更新します。

  1. サーバの再起動を必要とする変更内容で更新されたサーバ インスタンスがあれば、再起動します。

MBean の編集および編集のアクティブ化の例については、「例 : 管理ポートの変更」を参照してください。

編集セッションを開始する

編集セッションを開始するには、次の手順に従います。

  1. 編集 MBean サーバへの接続を開始します。
  2. 接続は java.management.MBeanServerConnection 型のオブジェクトを返します。

    MBean サーバへのリモート接続の作成」を参照してください。

  3. ConfigurationManagerMBean のオブジェクト名を取得します。
  4. ConfigurationManagerMBean は、編集セッションの開始および停止、コンフィグレーションに対する変更の保存、取り消し、およびアクティブ化を行うためのメソッドを提供します (『WebLogic Server MBean リファレンス』の「ConfigurationManagerMBean」を参照してください)。

    各ドメインは ConfigurationManagerMBean のインスタンスを 1 つだけ持ち、そのインスタンスは EditServiceMBean ConfigurationManagement 属性に格納されます。EditServiceMBean はすべての編集処理のエントリ ポイントです。簡単な固定のオブジェクト名を持ち、編集 MBean サーバ内の他のすべての MBean にアクセスするための属性とオペレーションが含まれています。

    ConfigurationManagerMBean オブジェクト名を取得するには、次のメソッドを使用します。
    MBeanServerConnection.getAttribute(
        ObjectName
    object-name, String attribute)
    各要素の説明は次のとおりです。

  5. 編集セッションを開始します。
  6. 編集セッションを開始するには、
    ConfigurationManagerMBean startEdit(int waitTime, int timeout) オペレーションを呼び出します。
    各要素の説明は次のとおりです。

    startEdit オペレーションは次のいずれかを返します。

MBean 属性を変更する、新しい MBean を作成する

既存の MBean の属性値を変更する、新しい MBean を作成する、または MBean を削除するには、次の手順に従います。

  1. 編集ツリーの階層を移動して、編集する MBean のオブジェクト名を取得します。MBean を作成または削除するには、適切なファクトリ メソッドを含む MBean のオブジェクト名を取得します。
  2. MBean 階層内の移動」を参照してください。

  3. MBean 属性の値を変更するには、MBeanServerConnection.setAttribute(object-name, attribute) メソッドを呼び出します。各要素の説明は次のとおりです。
  4. MBean を作成するには、その MBean の作成メソッドを呼び出します。たとえば、ServerMBean のインスタンスを作成するファクトリ メソッドは、DomainMBeancreateServer(String name) です。『WebLogic Server MBean リファレンス』では、各 MBean のファクトリ メソッドの場所が説明されています (「ServerMBean」を参照してください)。

  5. (省略可能) 複数の手順に分けて編集を行う場合は、ConfigurationManagerMBean validate() オペレーションを呼び出して、各手順の後に変更を検証することを検討してください。
  6. validate メソッドでは、未保存のすべての変更が、MBean 属性間の依存関係に関する要件を満たしているかどうかを検証し、1 つの属性の値が設定されただけでは行うことのできないその他のチェックを実施します。

    検証エラーが見つかった場合、validate() オペレーションは weblogic.management.mbeanservers.edit.ValidationException 型の例外を送出します。「編集処理によって送出される例外の型」を参照してください。

    save() オペレーションも保存前に変更を検証するので、ここでの検証は省略可能です。

保留中のコンフィグレーション ファイルに変更を保存する

ConfigurationManagerMBean save() オペレーションを呼び出して変更を保存します。

保存した変更をアクティブ化する

保存した変更をドメイン内でアクティブ化するには、次の手順に従います。

  1. ConfigurationManagerMBean activate(long timeout) オペレーションを呼び出します。timeout には、オペレーションが完了しなければならないミリ秒数を指定します。
  2. activate オペレーションは ActivationTaskMBean のインスタンスのオブジェクト名を返します。このインスタンスにはアクティブ化要求に関する情報が含まれています。「変更の表示と取り消し」を参照してください。

    activate オペレーションが成功するかタイムアウトすると、編集可能な階層でロックが解放されます。

  3. JMXConnector.close() を呼び出して、MBean サーバへの接続を閉じます。

例 : 管理ポートの変更

コード リスト 5-1 のコード例では、ドメインの Administration Console にアクセスするために使用するコンテキスト パスを変更しています。この動作は DomainMBean ConsoleContextPath 属性で定義されます。

コード例に関する以下の点に留意してください。

コード リスト 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();
   }
  /**
   * 編集セッションを開始する
   */
   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」を参照してください)。

表 5-1 編集処理によって送出される例外の型

例外の型

送出される場合

EditTimedOutException

編集セッションを開始する要求がタイムアウトした場合。

NotEditorException

ロックを取得せずに MBean を編集しようとした場合、または、管理ユーザが現在のロックを取り消して編集セッションを開始する場合。

ValidationException

MBean 属性の値を、誤ったデータ型、許容される範囲外の値、指定された値ではない値、他の属性との依存関係に適合しない値などに設定した場合。


 

 


変更の表示と取り消し

以下の節では、編集セッション中に行った変更の操作について説明します。

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」を参照してください。

編集セッションを終了するときに、保存されていない変更は破棄されます。

保存されていない変更を表示するには、次の手順に従います。

  1. 編集セッションを開始して、少なくとも 1 つの MBean 属性を変更します。
  2. ConfigurationManagerMBean Changes 属性の値を取得して、その出力を Object[] 型の変数に割り当てます。
  3. 配列内の各オブジェクトごとに Object.toString() を呼び出して、変更の説明を出力します。
  4. Changejavax.management.openmbean.CompositeType なので、配列内の各項目を CompositeType としてキャストし、変更に対して CompositeType のメソッドを呼び出すこともできます。J2SE 5.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 オブジェクトが格納されます (保存されてまだアクティブ化されていない変更のみを格納する属性はありません)。『WebLogic Server MBean リファレンス』の「ConfigurationManagerMBean UnactivatedChanges」を参照してください。

現在の編集セッション中に保存してまだアクティブ化していない変更、または以前の編集セッションで保存されてまだアクティブ化されていない変更を表示するには、次の手順に従います。

  1. 編集セッションを開始して、少なくとも 1 つの MBean 属性を変更します。
  2. ConfigurationManagerMBean UnactivatedChanges 属性の値を取得して、その出力を Object[] 型の変数に割り当てます。
  3. 配列内の各オブジェクトごとに Object.toString() を呼び出して、変更の説明を出力します。
  4. Changejavax.management.openmbean.CompositeType なので、配列内の各項目を CompositeType としてキャストし、変更に対して CompositeType のメソッドを呼び出すこともできます。J2SE 5.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 には、次のいずれかからアクセスできます。

現在のアクティブ化タスクにある変更のみを表示するには、次の手順に従います。

  1. 編集セッションを開始します。
  2. activate オペレーションの出力を javax.management.ObjectName 型のインスタンス変数に割り当てます。
  3. ActivationTaskMBean Changes 属性の値を取得して、その出力を Object[] 型の変数に割り当てます。
  4. 配列内の各オブジェクトごとに Object.toString() を呼び出して、変更の説明を出力します。
  5. Changejavax.management.openmbean.CompositeType なので、配列内の各項目を CompositeType としてキャストし、変更に対して CompositeType のメソッドを呼び出すこともできます。J2SE 5.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 つのオペレーションがあります。

変更を取り消すには、編集セッションを開始して、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」を参照してください。

現在のアクティブ化タスクのステータスを表示するには、次の手順に従います。

  1. 編集セッションを開始して、少なくとも 1 つの MBean 属性を変更します。
  2. ConfigurationManagerMBean activate(long timeout) オペレーションを呼び出して、その出力を ActivationTaskMBean 型の変数に割り当てます。
  3. ActivationTaskMBean State 属性の値を取得します。

メモリに格納されているすべてのアクティブ化タスクの表示

activate オペレーションが返す ActivationTaskMBean は 1 つのアクティブ化タスクのみを表します。管理サーバは、ユーザがパージするまでこの ActivationTaskMBean をメモリ内に保持します (「完了したアクティブ化タスクのメモリからのパージ」を参照)。パージしないと、アクティブ化タスクの数は ConfigurationManagerMBean CompletedActivationTasksCount 属性の値を超えます。

現在メモリに格納されているすべての ActivationTaskMBean インスタンスにアクセスするには、次の手順に従います (コード リスト 5-5 を参照)。

  1. 編集 MBean サーバに接続します (編集セッションを開始する必要はありません)。
  2. ConfigurationManagerMBean CompletedActivationTasks 属性の値を取得して、その出力を Object[] 型の変数に割り当てます。
  3. (省略可能) 配列内の各オブジェクトごとに、ActivationTaskMBean の属性 (UserState など) の値を取得して出力します。
  4. 『WebLogic Server MBean リファレンス』の「ActivationTaskMBean」を参照してください。

  5. (省略可能) 配列内の各オブジェクトごとに、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 は他のユーザが編集セッションを開始できないように (ロック) します。

以下のアクションによってロックが解除されます。

ロックが解除されると、保存されていないすべての変更は失われます。

 


ベスト プラクティス : 編集と例外処理の推奨パターン

編集するコードを複数の try-catch ブロックに整理することをお勧めします。そのようにすると、特定の型のエラーを捕捉して適切に対応できます。たとえば、編集が無効な場合に編集セッション全体を破棄するのではなく、その変更を保存して、例外を送出し、無効な変更をアクティブ化せずに終了することができます。

JMX エージェントはすべての例外を javax.management.MBeanException 型の汎用的な例外でラップします。JMX クライアントは MBeanException.getTargetException() を使用して、ラップされた例外のラップを解除することができます。

以下のような構成を利用することを検討してください (コード リスト 5-6 の擬似コードを参照)。

コード リスト 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 を参照)。

  1. MBean 属性をホストしている同じ WebLogic Server JVM で、バイト配列に値を書き込みます。
  2. バイト配列を weblogic.management.EncryptionHelper.encrypt( byte[]) メソッドに渡し、その戻り値を MBeanServerConnection.setAttribute メソッドに渡します。
  3. 暗号化された配列を変数には割り当てないでください。変数に割り当てると、ガベージ コレクションが行われてメモリが再割り当てされるまで、暗号化されていないバイト配列がメモリ内に保持されます。

  4. 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 はメモリ内に残ります。

互換性のある方法を使用するには、次の手順に従います。

  1. 値を String に書き込みます。
  2. String をパラメータとして MBeanServerConnection.setAttribute メソッドに渡します。ただし、暗号化された属性の値を設定する代わりに、対応する暗号化されていない属性の値を設定します。
  3. 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 はメモリから消去されません。

 

フッタのナビゲーションのスキップ  ページの先頭 前 次