ポートレット開発ガイド

     前  次    目次     
ここから内容

ポートレット パフォーマンスの監視および確認

Oracle WebLogic Portal は一連の分析をサポートします。Oracle WebCenter Analytics などの他の製品へ情報を送信するにはこれらの分析を使用できます。また、カスタム コードを使ってローカルで分析を使用することもでます。これらの分析は com.bea.netuix.servlets.controls.analytics パッケージ内のパブリック WebLogic Portal API を通じて公開されます。詳細については、WebLogic Portal 「Javadoc」を参照してください。

この章では、サービス レベル アグリーメント (SLA) のモニタ 、特定のポートレットの応答時間が一定時間を越える場合の警告のトリガ、不正な動作を行うポートレットの代替ポートレットへの置換などに使用するための、このメトリクスの派生および使用に焦点を合わせて説明します。

この付録は、次の節で構成されています。

 


はじめに

ポータルの集約コンテンツまたはアプリケーションポータルは、ポートレットというサブコンポーネントにこれらのアプリケーションまたはコンテンツをカプセル化します。1 つの場所で管理できるようにポートレットを統合ビューに結合します。これらのポートレットのうちのいずれかのポートレットが不正な動作をしたり、利用できなくなった場合には何が起こるでしょうか。WebLogic Portal には、これらのシナリオを取り扱うための複数のオプションがあります。一般的なオプションは、Web Service for Remote Portlets (WSRP)、タイムアウト、インターセプタ、キャッシング、スレッディングおよび AJAX 対応ポートレットです。これらのソリューションはそれぞれ異なる方法で問題を解決し、特有のメリットとデメリットがあります。パブリック API com.bea.netuix.servlets.controls.analytics パッケージを使用して、問題を包括的に解決できます。

 


使用例

さまざまなアプリケーション (ポートレット) を 1 つのポータルに集約するポータルがあると仮定します。各アプリケーション (ポートレット) は独立してミッション クリティカルなアプリケーションであり、1 つのアプリケーションが停止しても、それによって他のアプリケーションを中断してはいけません。また、1 つのアプリケーションが停止すると、その場所に代替 (バックアップ) アプリケーションが表示される必要があります。元のアプリケーションが通常のサービス レベルを再開した後、一時プリケーションを置き換えるために、そのアプリケーションをオンラインに戻す必要があります。

ポートレットが特定のサービス レベル アグリーメントを満たさないことを決定することが最初の課題です。SLA に適用するロジックに基づいて、特定のポートレットをオンラインまたはオフラインに変更できる機能を提供することが次の課題です。

注意 : ここに記述した方法と一緒にこれらの問題を扱う前述の方法を使用できます。簡素化のため、この例には、他のメカニズムは含まれていません。

ポートレット エラーおよび置き換えのソリューションは WebLogic Portal の 2 つの機能を使用します。ポートレットが特定の SLA を満たさないことを検出するには最初の機能を使用します。2 つ目の機能は、不正な動作をするポートレットを無効にして、その代わりに一時的なポートレットを有効にします。これらの機能は個別に使用できますが、2 つの機能を組み合わせると、問題を解決するための包括的なソリューションが得られます。

 


不正な動作を行うポートレットの検出

分析イベントを取り込むには、Oracle WebCenter Analytics がそのイベントをすべて取り込むために使用するものと同じフックを使用します。ただし、Oracle WebCenter Analytics で豊富に備えているレポート機能を提供するためにこのフックを使用する代わりに、不正な動作を行うポートレット決定するためにも使用できます。

最初に AnalyticEventHandler インタフェースを実装します。ポートレットまたはページの処理が完了するたびに、サーバによって1回または複数回このインタフェースの実装が呼び出されます。つまり、要求ごとに 50 回以上呼び出されるため、実行されるので、それを極めて効率的に行う必要があります。

コード リスト 8-1 ポートレットの表示時間の検出
public class MyAnalyticEventHandlerImpl implements AnalyticEventHandler
{
   private final static long SLA = 5000000000L; // 5秒 (ナノ時間)

   /**
   * <p>実装のクラスはここで 1 回の初期化処理を実行する場合があります。この
   * メソッドが失敗する (例外を送出する) 場合、 イベント ハンドラは
   * 登録されず、イベント処理は全く実行されません。</p>
   */
   public void init() {
      System.out.println("My Analytic Event Handler Initialized");
   }

   /**
   * <p>このメソッドはそれぞれのページの端またはポートレットの実行
   * にあるコンテナによって呼ばれます。これは各ページおよびポートレットへの要求ごとに呼び出されます。
   * このメソッドは、頻繁に呼ばれるので、実装は
   * 極めて効率的である必要があります。効率的でない場合、全体のポータルのパフォーマンスが影響を受けます。</p>
   * @param analyticEvent はログに記録されるイベントです。
   */
   public void log(AnalyticEvent analyticEvent)
   {
      // ポートレット イベントを除いて他のすべてのイベントを無視します。
      if (analyticEvent.getAnalyticEventObject().equals
            (AnalyticEvent.AnalyticEventObject.PORTLET))
      {
         if (analyticEvent.getTotalTime() > SLA)
         {
            System.out.println("WARNING: portlet " +
               analyticEvent.getDefinitionLabel() + " is exceeding SLA of " +
               String.valueOf(SLA / 1000000000L) + " seconds.");
         }
      }
   }

   /**
   * <p>ここで実装のクラスは、クリーンアップ操作を実行する場合があります。
   * 注意 : このメソッドが呼び出されることは保証されていません。
   * </p>
   */
   public void dispose() {
   }
}

主要なメソッドとして log(AnalyticEvent analyticEvent) メソッドがあります。要求ごとに、各ページおよびポートレットに対してこのメソッドが呼び出されます。AnalyticEvent クラスには、ポートレットのさまざまなライフサイクル フェーズに対する時間を含む情報があります。

AnalyticEventObject には、不正な動作を行うポートレットを検出する機能を提要する 3 つの属性またはメソッドがあります。

ポートレットの表示に 5 秒以上時間がかかる場合、エラー メッセージがコンソールに記録されます。これらのメソッドによって返された時間はナノ秒で表示されています。次の節に示すように、ServiveLevelManager サービスを使用して、ポートレットを無効化し、別のポートレットを有効化することができます。

一般的に、JAR ファイルでサービス プロバイダーをパッケージする必要があります。JAR は必要なクラス (AnalyticEventHandlerを含めて) および META-INF/services/com.bea.netuix.servlets.controls.analytics.AnalyticEventHandler ファイルで構成される必要があります。このサービス ファイルには、ただ1つのクラス名を持つ必要があり、AnalyticEventHandler 実装を行う必要があります。

サービス プロバイダー JAR または JARs は Web アプリケーションの WED-INF/lib ディレクトリにある JAR を含めて、アプリケーションと共にデプロイする必要があります。プロバイダー JARs は、アプリケーションまたはシステム クラスパスにも含む場合がありますが、これはプロバイダー クラス オブジェクト スコープを変更し、複数の Web アプリケーションで共有するプロバイダー実装の原因になります。

 


不正な動作のポートレットの無効化または代替ポートレットの有効化

ServiceLevelManager サービスでさまざまな ID に基づいてポートレットの無効化または有効化できます。ポートレットの特定のインスタンスまたはポートレット定義のすべてのインスタンスを無効にすることができます。この例では、ポートレット定義のすべてのインスタンスが無効化されています。この選択は、ポートレット定義が不正な動作を行う場合、そのポートレットのすべてのインスタンスも不正な動作を行うという仮定に基づいています。1 つの不正なインスタンスを簡単に無効化することができます。

または、管理 JSP から ServicLevelManger インスタンスを呼び出すことができます。このアプローチを使用する場合は、管理 JSP はすべての不正な動作を行うポートレットを一覧表示します。管理者は、不正な動作を行うポートレットを手動で無効にする必要があり、他のポートレットを再び有効にする必要があります。

使用例で説明した状況に、[サービスが停止されています]、[結果のキャッシュされたセットを提供してください]、[他のソースから情報を取得してください] などのメッセージが表示される代替ポートレットを作成します。実行される動作にかかわらず代替ポートレットは、不正な動作を行うポートレットと同じプレースホルダに配置します。

次の コード リスト 8-2 に示すように、代替ポートレットを起動した場合、無効化されます。ポートレットにエラーが発生した場合、代替ポートレットが有効化され、不正な動作の ポートレットは無効化されます。

コード リスト 8-2 交互ポートレットの有効化または不正な動作を行うポートレットの無効化
/**{@link AnalyticEventHandler} 実装用のサービス プロバイダ インタフェース。
 * <p/>
 * 分析イベント ハンドラは引数なしのパブリック コンストラクタを含むまたは以下に指定された
 * インタフェースメソッドを実装するインタフェースの
 * 具象サブクラスです。
 * <p/>
 * 一般に、AnalyticEventHandler インプリメンターはそれらのプロバイダーを
 * jar にパッケージする必要があります。その jar は必要なクラス (AnalyticEventHandler の実装を含む)、
 *または
 * <tt>META-INF/services/com.bea.netuix.servlets.controls.
 * analytics.AnalyticEventHandler<tt> ファイルで構成されている必要があります。そのサービス ファイルには、
 * クラス名が 1 つのみである必要がありますが、AnalyticEventHandler の
 * 具象実装を行う必要があります。
 * <p/>
 * プロバイダjar(s) は webapp's の
 * <tt>WED-INF/lib</tt> ディレクトリで jar を含むアプリケーションにデプロイする必要があります。
 * プロバイダー JARs は、アプリケーションまたはシステム クラスパスにも含む場合がありますが、
 * これはプロバイダー クラス オブジェクト スコープを変更し、
 * 複数の Web アプリケーションで共有するプロバイダー実装の原因になります。
 * <p/>
 * 初期化した場合、{@link com.bea.netuix.servlets.controls.
 * analytics.AnalyticEventDispatcher} はプロバイダーをロードします。
 * ディスパッチャはイベント ハンドラのロードまたは初期化に失敗した場合、エラー メッセージがログに記録され、
 * イベント処理は実行されません。
 * <p/>
 * 注意 : 複数の同時スレッドが使用されるインタフェース メソッド実装は
 * 安全でる必要があります。
 * <p/>
 */
パブリック クラス MyAnalyticEventHandlerImpl は AnalyticEventHandler を実装します。
{
   private final static long SLA = 5000000000L; // 5 秒 (ナノ時間)
   /**
    * <p>実装のクラスは、ここで 1 回の初期化処理を実行する場合があります。
    * このメソッドは失敗した場合、(例外を送出します) イベント ハンドラは
    * 登録できなく、イベント処理は実行されません。</p>
    */
   public void init() {
      System.out.println("My Analytic Event Handler Initialized");
      // 代替ポートレットを無効にします。
      ServiceLevelManagerFactory serviceLevelManagerFactory =
      ServiceLevelManagerFactory.getInstance();
      ServiceLevelManager serviceLevelManager =
      serviceLevelManagerFactory.getServiceLevelManager("/portal_1");
      serviceLevelManager.setServiceLevelForDefinitionLabel(PortletServiceLevel.suspended, "alternate_pdl");
   }
   /**
    * <p>コンテナは、ページまたはポートレットを実行
    * した後このメソッドを呼び出します。各ページおよびポートレットへの要求ごとに
    * このメソッドを呼び出します。このメソッドは、頻繁に呼ばれるので、実装は
    * 極めて効率的である必要があります。効率的でない場合、全体のポータルのパフォーマンス
    * が影響を受けます。</p>
    * @param analyticEvent はログに記録されるイベントです。
    */
   public void log(AnalyticEvent analyticEvent)
   {
      // ポートレット イベントを除いて他のすべてのイベントを無視します。
      if (analyticEvent.getAnalyticEventObject().equals
         (AnalyticEvent.AnalyticEventObject.PORTLET))
      {
         // したがって、ポートレットの応答時間は SLA より長く場合、そのポートレットが
         // 無効化されます。
         if (analyticEvent.getTotalTime() > SLA)
         {
            System.out.println("WARNING: portlet " +
               analyticEvent.getDefinitionLabel() + " is exceeding SLA of "
               + String.valueOf(SLA / 1000000000L) + " seconds.");
            ServiceLevelManagerFactory serviceLevelManagerFactory =
            ServiceLevelManagerFactory.getInstance();
            System.out.println("Servlet context path: " +
            analyticEvent.getServletContextName());
            // 注意 : サービス レベル マネージャは、コンテキスト パスにスコープ指定されます。
            // (request.getContextPath()) 上記は、10.2 以前のバージョンの場合有効ですが、
            // 10.2 では、String getWebappContextPath(); を使用して、
            //AnalyticEvent からコンテキスト パスを取得できます。
            ServiceLevelManager serviceLevelManager =
            serviceLevelManagerFactory.getServiceLevelManager("/portal_1");
            PortletServiceLevel portletServiceLevel =
            serviceLevelManager.getServiceLevelForDefinitionLabel
            (analyticEvent.getDefinitionLabel());
            System.out.println("Suspending Portlet: " +
            analyticEvent.getDefinitionLabel());
            serviceLevelManager.setServiceLevelForDefinitionLabel
            (PortletServiceLevel.suspended,
            analyticEvent.getDefinitionLabel());
            //代替ポートレットをアクティブにします。
            System.out.println("Activating Alternate Portlet ");
serviceLevelManager.setServiceLevelForDefinitionLabel(PortletServiceLevel.active, "alternate_pdl");
         }
      }
   }
   /**
    * <p>ここで実装のクラスは、クリーンアップ操作を実行する場合があります。
    * 注意 : このメソッドが呼び出されることは保証されていません。
    * </p>
    */
   public void dispose() {
   }
}

ServiceLevelManager への参照を取得するには、サービス レベル ファクトリから参照にアクセスする必要があります。ServiceLevelManagers は Web アプリケーションにスコープ指定されます。したがって、ファクトリに対して webapp コンテキスト パスが必要となります。必要となるメソッドは以下の通りです。

serviceLevelManagerFactory.getServiceLevelManager("/mywebapp");

指定のポートレットを無効または有効にするには、選択したポートレットに PortletServiceLevel を設定します。コード リスト 8-2 での以下のコードは代替ポートレットを無効にします。

serviceLevelManager.setServiceLevelForDefinitionLabel(PortletServiceLevel.
   suspended, analyticEvent.getDefinitionLabel());

下記のメソッドと同じメソッドを使用して代替ポートレットを有効します。

serviceLevelManager.setServiceLevelForDefinitionLabel(PortletServiceLevel.
   active, "alternate_pdl");

この例には、ポートレットを実行して、5 秒以上の時間がかかる場合のみ、そのポートレットは不正な動作のポートレットとし無効化されます。実際のアプリケーションに、適当な実装を行うには、タイムアウトを使用します。この要求は既に完了しているので、代替ポートレットは次の要求までオンラインで実行できません。代替ポートレットをこの要求の一部として実行する場合、新しいポートレットを取り込むリダイレクトを実行することができます。

WebLogic Portal 10.0 では、Web アプリケーション コンテキスト パスをハード コーディングする必要があります。

ServiceLevelManager serviceLevelManager =
      serviceLevelManagerFactory.getServiceLevelManager("/portal_1");

WebLogic Portal 10.2 と以降のバージョンでは、分析イベントから以下の機能を使用してこのパスを取得することができます。

String getWebappContextPath();

  ページの先頭       前  次