ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server リソース アダプタ プログラマーズ ガイド
11g リリース 1 (10.3.1)
B55541-01
  目次
目次

戻る
戻る
 
次へ
次へ

4 プログラミング タスク

以下の節では、WebLogic Server リソース アダプタのプログラミング タスクについて説明します。

リソース アダプタに必要なクラス

J2CA 1.5 仕様に従い、リソース アダプタには以下の Java クラスが必要です。

これらのクラスを ra.xml ファイルに指定します。たとえば、

<managedconnectionfactory-class>
com.sun.connector.blackbox.LocalTxManagedConnectionFactory
</managedconnectionfactory-class>

<connectionfactory-interface>
javax.sql.DataSource
</connectionfactory-interface>

<connectionfactory-impl-class>
com.sun.connector.blackbox.JdbcDataSource
</connectionfactory-impl-class>

<connection-interface>
java.sql.Connection
</connection-interface>

<connection-impl-class>
com.sun.connector.blackbox.JdbcConnection
</connection-impl-class>

また、リソース アダプタで着信メッセージングをサポートする場合は、サポートする着信メッセージのタイプごとに ActivationSpec クラスが必要になります。「メッセージ インフローとトランザクション インフロー」を参照してください。

これらのリソース アダプタ クラスの詳細は、開発するリソース アダプタの性質によって異なります。

起動クラスとして実行するためのリソース アダプタのプログラミング

WebLogic Server 起動クラスを使用する代わりに、javax.resource.ResourceAdapter を実装した最小限のリソース アダプタ クラスを持つリソース アダプタをプログラミングし、そのクラスで start() および stop() メソッドを定義することができます。


注意 :

ResourceAdapter インタフェースの定義のために、endpointActivation()Deactivation()、および getXAResource() メソッドも定義する必要があります。

リソース アダプタがデプロイされるときに、start() メソッドが呼び出されます。アンデプロイされるときに、stop() メソッドが呼び出されます。WebLogic Server 起動クラスと同様に、リソース アダプタが開始する作業は start() メソッドの中で実行できます。

リソース アダプタでは、start() メソッド内で BootstrapContext を介してワーク マネージャにアクセスするため、直接的なスレッド管理は使用しないで、Work インスタンスを送信する必要があります。それによって、WebLogic Server は自動チューニングのワーク マネージャを通じて、スレッドを効率的に管理できます。

実行用に Work インスタンスが送信されたら、リソース アダプタの完全なデプロイメントに干渉しないように、start() メソッドはすぐに復帰する必要があります。そのため、ワーク マネージャでは、doWork() メソッドではなく、scheduleWork() または startWork() メソッドを呼び出す必要があります。

以下に示すのは、最小限のリソース アダプタ クラスを持つリソース アダプタの例です。これは、(println 文を除けば) 開発できる最小限のリソース アダプタです。この例では、start() メソッドで実行される作業は stdout (標準出力) へのメッセージの出力のみです。

コード リスト 4-1 最小限のリソース アダプタ

import javax.resource.spi.ResourceAdapter;
import javax.resource.spi.endpoint.MessageEndpointFactory;
import javax.resource.spi.ActivationSpec;
import javax.resource.ResourceException;
import javax.transaction.xa.XAResource;
import javax.resource.NotSupportedException;
import javax.resource.spi.BootstrapContext;
/**
* このリソース アダプタは、(println を除いて) ビルドできる最小限のリソース アダプタ
*/
public class ResourceAdapterImpl implements ResourceAdapter
{
   public void start( BootstrapContext bsCtx )
   {   
      System.out.println( "ResourceAdapterImpl started" );
   }
   public void stop()
   {
      System.out.println( "ResourceAdapterImpl stopped" );
   }
   public void endpointActivation(MessageEndpointFactory messageendpointfactory, ActivationSpec activationspec)
      throws ResourceException
   {
      throw new NotSupportedException();
   }
   public void endpointDeactivation(MessageEndpointFactory messageendpointfactory, ActivationSpec activationspec)
   {
   }
   public XAResource[] getXAResources(ActivationSpec aactivationspec[])
      throws ResourceException
   {
      throw new NotSupportedException();
   }
}

以下に示すのは、Work インスタンスをワーク マネージャに送信するリソース アダプタの例です。リソース アダプタは start() メソッド内で作業を開始します。したがって、J2EE に準拠した起動クラスとして機能します。

コード リスト 4-2 ワーク マネージャを使用し、Work インスタンスを送信するリソース アダプタ

import javax.resource.NotSupportedException;
import javax.resource.ResourceException;
import javax.resource.spi.ActivationSpec;
import javax.resource.spi.BootstrapContext;
import javax.resource.spi.ResourceAdapter;
import javax.resource.spi.endpoint.MessageEndpointFactory;
import javax.resource.spi.work.Work;
import javax.resource.spi.work.WorkException;
import javax.resource.spi.work.WorkManager;
import javax.transaction.xa.XAResource;
/**
* このリソース アダプタは start() メソッド内で作業を開始する
* したがって、J2EE に準拠した「起動クラス」として機能する
*/
public class ResourceAdapterWorker implements ResourceAdapter
{
   private WorkManager wm;
   private MyWork someWork;
   public void start( BootstrapContext bsCtx )
   {
      System.out.println( "ResourceAdapterWorker started" );
      wm = bsCtx.getWorkManager();
      try
      {
         someWork = new MyWork();
         wm.startWork( someWork );
      }
      catch (WorkException ex)
      {
         System.err.println( "Unable to start work: " + ex );
      }
   }
   public void stop()
   {
   // start() メソッド内で開始された作業を停止する
   someWork.release();
      System.out.println( "ResourceAdapterImpl stopped" );
   }
   public void endpointActivation(MessageEndpointFactory messageendpointfactory,
             ActivationSpec activationspec)
      throws ResourceException
   {
      throw new NotSupportedException();
   }
   public void endpointDeactivation(MessageEndpointFactory
             messageendpointfactory, ActivationSpec activationspec)
   {
   }
   public XAResource[] getXAResources(ActivationSpec activationspec[]) 
      throws ResourceException
   {
      throw new NotSupportedException();
   }
   // Work クラス
   private class MyWork implements Work
   {
      private boolean isRunning;
      public void run()
      {
         isRunning = true;
         while (isRunning)
         {
         // 1 つの作業を行う (ソケットのリスン、着信メッセージの待機、
         // 何らかのステータスのチェックなど)
         System.out.println( "Doing some work" );
         // おそらく、一定の時間または何らかのイベントを待機する
         try
         {
            Thread.sleep( 60000 ); // 1 分間待機する
         }
         catch (InterruptedException ex)
         {}
      }
   }
   public void release()
   {
         // run() ループの停止を指示する
         isRunning = false;
      }
   }
}

リソース アダプタのアクティビティの中断と再開

suspend() メソッドを使用するようにリソース アダプタをプログラミングすると、アクティビティを中断するためのカスタムの動作を行えます。たとえば、suspend() メソッドを使用すると、進行中のトランザクションが完了するまでの間、すべての着信メッセージをキューに入れたり、メッセージの受信が一時的にブロックされていることをエンタープライズ情報システム (EIS) に通知したりできます。

その後で resume() メソッドを呼び出して、着信キューを排出してメッセージを配信するように指示したり、EIS にメッセージの受信が再び可能になったことを通知したりします。基本的に、resume() メソッドによってリソース アダプタは通常の処理を続行できるようになります。

suspend() および resume() メソッドを開始するには、WebLogic Scripting Tool を使用して、または WebLogic Server Administration Console から、リソース アダプタの実行時 MBean をプログラム的に呼び出します。詳細については、『Oracle Fusion Middleware Oracle WebLogic Server Administration Console ヘルプ』の「リソース アダプタの起動と停止」を参照してください。

Suspendable.supportsSuspend() メソッドでは、リソース アダプタが特定の種類の中断をサポートしているかどうかを判断します。Suspendable.isSuspended() メソッドでは、リソース アダプタが現在中断されているかどうかを判断します。

suspend()resume()、またはプロダクションの再デプロイメントをサポートするリソース アダプタでは、Suspendable インタフェースを実装して、これらのオペレーションがサポートされることを WebLogic Server に知らせる必要があります。これらのオペレーションは、以下のことが行われた場合に WebLogic Server によって呼び出されます。

コード リスト 4-3 では、リソース アダプタの Suspendable インタフェースを示しています。

コード リスト 4-3 Suspendable インタフェース

package weblogic.connector.extensions;
import java.util.Properties;
import javax.resource.ResourceException;
import javax.resource.spi.ResourceAdapter;
/**
* ResourceAdapter JavaBean で中断、再開、または side-by-side バージョニング
* をサポートしている場合は、Suspendable を実装できる
* @author Copyright (c) 2002 by BEA Systems, Inc. All Rights Reserved.
* @since November 14, 2003
*/
public interface Suspendable
{
/**
* 着信通信が中断/再開されることを示すのに使用する
*/
int INBOUND = 1;
/**
* 発信通信が中断/再開されることを示すのに使用する
*/
int OUTBOUND = 2;
/**
* Work の送信が中断/再開されることを示すのに使用する
*/
int WORK = 4;
/**
* 着信、発信、および WORK が中断/再開されることを示すのに使用する
*/
int ALL = 7;
/**
* suspend() オペレーションを示すことができる
*/
int SUSPEND = 1;
/**
* resume() オペレーションを示すことができる
*/
int RESUME = 2;
/**
* 指定されたアクティビティを中断するリクエスト。プロパティは null、または
* RA 固有のニーズに従って指定できる 
* @param type 要求される中断の種類を指定する 1 から 7 までの int 
* requested (例 : Suspendable.INBOUND、.OUTBOUND、.WORK またはこれらの値の組み合わせ、
* あるいは Suspendable.ALL)
* @param props 固有の目的に使用する省略可能なプロパティ
* (または null)
* @exception ResourceException リソース アダプタが要求を完了できない場合
* 場合
*/
void suspend( int type, Properties props ) throws ResourceException;
/**
* 指定されたアクティビティを再開する要求。プロパティは null、または
* RA 固有のニーズに従って指定できる
*
*@param type 要求される再開の種類を指定する 1 から 7 までの int
* (例 : Suspendable.INBOUND、.OUTBOUND、.WORK、またはこれらの値の組み合わせ、
* あるいは Suspendable.ALL)
* @param props ResourceAdapter 固有の目的に使用する省略可能なプロパティ
* (または null)
* @exception ResourceException リソース アダプタが要求を完了できない
* 場合
*/
void resume( int type, Properties props ) throws ResourceException;
/**
*
* @param type ここで問い合わせる中断の種類を指定する 1 から 7 までの int
* (例 : Suspendable.INBOUND、.OUTBOUND、.WORK、またはこれらの値の組み合わせ、
* あるいは Suspendable.ALL)
* @return true 指定された種類の中断がサポートされる場合
*/
boolean supportsSuspend( int type );
/**
* 
* 指定された種類のアクティビティが現在中断されている
* かどうかを判断する
*
* @param type 要求されるアクティビティの種類を指定する 1 から 7 までの int
* (例 : Suspendable.INBOUND、.OUTBOUND、.WORK、またはこれらの値の組み合わせ、
* あるいは Suspendable.ALL)
* @return true このリソース アダプタで、指定された種類のアクティビティが
* 中断されている場合
*/
boolean isSuspended( int type );
/**
* このリソース アダプタが、init() メソッドをサポートしているかどうかを判断する
* (リソース アダプタのバージョニング (side-by-side デプロイメント) に使用されるメソッド)
*
* @return true このリソース アダプタが init() メソッドをサポートしている場合
*/
boolean supportsInit();
/**
* このリソース アダプタが、startVersioning() メソッドをサポートしている
* かどうかを判断する
* (リソース アダプタのバージョニング (side-by-side デプロイメント) に使用されるメソッド)
*
* @return true このリソース アダプタが startVersioning() メソッドをサポートしている場合
*/
boolean supportsVersioning();
/**
* 新しいバージョンのリソース アダプタがデプロイされることを
* 現在のバージョンのリソース アダプタに示すために、WLS によって使用される。このメッソドは、
* 古い RA から新しい RA にサービスを移行するために、
* このメソッドを使用できる。
* 呼び出された後、ResourceAdapter は ExtendedBootstrapContext.complete() メソッドを介して、
* アンデプロイを行ってよいことをコネクタ コンテナ
* に通知する必要がある。
*
* @param ra 新しい ResourceAdapter JavaBean
* @param props アンデプロイできるバージョン
* に関連付けられたプロパティ
* @exception ResourceException 何らかの問題が発生した場合
*/
void startVersioning( ResourceAdapter ra, 
Properties props ) throws ResourceException;
/**
* デプロイ済みのリソース アダプタの新しいバージョンであることを
* ResourceAdapter に通知する。このメッソドは、新しいリソース アダプタが
* リソース アダプタと起動を調整できるように、
* start() メソッドより前に呼び出される。
* @param ra 現在動作している、リソース アダプタの古いバージョン
* @param props バージョニング オペレーションに関連付けられたプロパティ
* @exception ResourceException init() が失敗した場合。
*/
void init( ResourceAdapter ra, Properties props ) throws ResourceException;
}

拡張された BootstrapContext

リソース アダプタをデプロイするときに、そのアダプタの ra.xml 記述子の <resource-adapter-class> 要素でリソース アダプタ JavaBean が指定されている場合、Weblogic Server コネクタ コンテナでは、J2CA 1.5 仕様 (http://java.sun.com/j2ee/connector/) に従って、そのリソース アダプタ bean の start() メソッドを呼び出します。リソース アダプタのコードでは、start() メソッドによって渡される BootstrapContext オブジェクトを、次のような目的に使用できます。

これらの機能はすべて J2CA 1.5 仕様で規定されています。

必須の javax.resource.spi.BootstrapContext の実装に加えて、リソース アダプタの start() メソッドに渡される BootstrapContext オブジェクトでは、weblogic.connector.extensions.ExtendedBootstrapContext も実装します。それによって、リソース アダプタは、診断機能を提供する WebLogic Server 固有の拡張機能にアクセスできます。以下の節ではこれらの拡張機能について説明します。

診断コンテキスト ID

WebLogic Server 診断フレームワークでは、スレッドに診断コンテキストを関連付けることができます。スレッド上の要求は実行のパスに沿って処理を進める際に、その有効期間を通じて診断コンテキストを保持します。ExtendedBootstrapContext を使用すると、リソース アダプタ開発者は、String からなる診断コンテキストのペイロードを設定できます。その String を使用して、たとえば、EIS からメッセージ エンドポイントまで要求の実行を追跡することができます。この機能はさまざまな診断の目的に利用できます。たとえば、EIS からの着信メッセージにおいて、String にクライアント ID やセッション ID を設定できます。メッセージのディスパッチ中にさまざまな診断結果を収集し、システム内の要求の流れを表示することが可能です。リソース アダプタ クラスを開発するときに、このような目的で setDiagnosticContextID() および getDiagnosticContextID() メソッドを利用できます。診断コンテキストの詳細については、『Oracle Fusion Middleware Oracle WebLogic Server のコンフィグレーションと診断フレームワークの使い方』を参照してください。

仕分けビット

WebLogic Server 診断フレームワークは、要求を仕分けする機能も備えています。ExtendedBootstrapContext を使用すると、リソース アダプタ開発者は、どのような目的で診断を行う場合でも、現在のスレッド上で 4 つの仕分けビットを設定して取得できます。たとえば、仕分けビットを使用して要求の優先順位を設定できます。要求の仕分けの詳細については、『Oracle Fusion Middleware Oracle WebLogic Server のコンフィグレーションと診断フレームワークの使い方』を参照してください。

コールバック機能

ExtendedBootstrapContext.complete() メソッドをコネクタ コンテナへのコールバックとして使用できます。この機能の詳細については、『Oracle Fusion Middleware Oracle WebLogic Server アプリケーションのデプロイメント』の「プロダクション環境でのアプリケーションの再デプロイ」を参照してください。