作業域を使用するアプリケーションの開発

アプリケーションは UserWorkArea インターフェースを実装することにより、作業域サービスと対話します。このインターフェースは、作業域を作成、操作、および終了するために使用されるすべてのメソッドを定義します。

このタスクについて

package com.ibm.websphere.workarea;

public interface UserWorkArea {
   void begin(String name);
   void complete() throws NoWorkArea, NotOriginator;

   String getName();
   String[] retrieveAllKeys();
   void set(String key, java.io.Serializable value)
      throws NoWorkArea, NotOriginator, PropertyReadOnly;
   void set(String key, java.io.Serializable value, PropertyModeType mode)
      throws NoWorkArea, NotOriginator, PropertyReadOnly;
   java.io.Serializable get(String key);
   PropertyModeType getMode(String key);
   void remove(String key)
      throws NoWorkArea, NotOriginator, PropertyFixed;
}
重要: Enterprise JavaBeans (EJB) アプリケーションでは、 リモート・インターフェースまたはローカル・インターフェースのいずれか、あるいは両方のメソッドの 実装内でのみ、UserWorkArea インターフェースを使用できます。同様に、サーブレットでは、 HTTPServlet クラスの service メソッドの中でのみ、このインターフェースを使用できます。 サーブレットまたはエンタープライズ Bean のライフサイクル・メソッド内での 作業域の使用は、作業域のプログラミング・モデルからの逸脱と見なされ、サポートされません。
作業域サービスでは、UserWorkArea インターフェースで使用する、 以下のような例外が定義されています。
NoWorkArea
要求で要求された関連作業域が存在していない場合に発生します。
NotOriginator
インポートされた作業域の内容を要求が操作しようとすると発生します。
PropertyReadOnly
読み取り専用プロパティーまたは固定読み取り専用プロパティーを要求が 変更しようとすると発生します。
PropertyFixed
指定されたプロパティーがいずれかの固定モードである場合、remove メソッド によって発生します。

手順

  1. 次のいずれかの方法により、区画にアクセスします。
    • 『UserWorkArea 区画へのアクセス』に従い、UserWorkArea 区画にアクセスします。
    • 『ユーザー定義の作業域区画へのアクセス』に従い、ユーザー定義の作業域にアクセスします。
    次のステップでは、例として UserWorkArea 区画を使用していますが、 ユーザー定義の区画も同様の方法で使用できます。
  2. 新しい作業域を開始します。

    begin メソッドを使用して新規作業域を作成し、これを呼び出し元のスレッドに関連付けます。 作業域の有効範囲は、作業域が開始され、複数のスレッドからはアクセスできないスレッドです。begin メソッドは引数として 1 つのストリングを取ります。 このストリングは、作業域に名前を付けるために使用されます。 引数はヌルであってはなりません。 ヌルの場合は、java.lang.NullPointer 例外が発生します。次のコード例では、アプリケーションは SimpleSampleServlet という名前で新規の作業域を開始しています。

    public class SimpleSampleServlet {
    ...
       try {
          ...
          userWorkArea = (UserWorkArea)jndi.lookup(
             "java:comp/websphere/UserWorkArea");
       }
       ...
    
       userWorkArea.begin("SimpleSampleServlet");
       ...
    }

    begin メソッドはまた、ネストされた作業域の作成にも使用されます。 begin メソッドが呼び出されたときに作業域がスレッドと関連付けられている場合、 begin メソッドは既存の作業域内に新規のネストされた作業域を作成します。

    作業域サービスは、作業域に関連付けられた名前は使用しないため、 任意の方法で、作業域に名前を付けることができます。 名前は固有である必要はありませんが、その名前がアプリケーション内で区別しやすく、 わかりやすいものだと、デバッグの際により便利です。 アプリケーションは getName メソッドを使用して、begin メソッドによって 作業域に関連付けられた名前を戻すことができます。

  3. 作業域のプロパティーを設定します。

    現行の作業域を持つアプリケーションは、プロパティーをその作業域へ挿入したり、 その作業域からプロパティーを取り出したりすることができます。 UserWorkArea インターフェースは、 プロパティーを設定するための 2 つの set メソッドと、プロパティーを取り出すための get メソッドを 備えています。2 つの引数を取る set メソッドは、標準のプロパティー・モードでプロパティーを挿入します。 3 つの引数を取る set メソッドは、プロパティー・モードを 3 番目の引数として受け取ります。どちらの set メソッドも、キーと値を引数として受け取ります。 キーはストリングで、値は java.io.Serializable 型のオブジェクトです。 どちらの場合も、引数はヌルであってはなりません。 ヌルの場合は、java.lang.NullPointer 例外が発生します。

    次の SimpleSample アプリケーションでは、プロパティーの値として、SimpleSampleCompany クラスと SimpleSampleProperty クラスの 2 つのクラスのオブジェクトを使用しています。 SimpleSampleCompany クラスはサイト ID に使用され、 SimpleSamplePriority クラスは優先順位に使用されます。

    public class SimpleSampleServlet {
       ...
       userWorkArea.begin("SimpleSampleServlet");
    
       try {
                // Set the site-identifier (default is Main).
          userWorkArea.set("company",
             SimpleSampleCompany.Main, PropertyModeType.read_only);
    
                // Set the priority.
          userWorkArea.set("priority", SimpleSamplePriority.Silver);
       }
    
       catch (PropertyReadOnly e) {
         // The company was previously set with the read-only or
         // fixed read-only mode.
         ...
       }
    
        catch (NotOriginator e) {
         // The work area originated in another process,
         // so it can't be modified here.
         ...
       }
    
       catch (NoWorkArea e) {
          // There is no work area begun on this thread.
          ...
       }
    
       // Do application work.
       ...
    }

    get メソッドはキーを引数として受け取り、Java™ Serializable オブジェクトをそのキーに関連付けられている値として返します。 例えば、上のコード例では、作業域から company キーの値を取り出すために、作業域に対して get メソッドを使用して値を取り出しています。

    プロパティー・モードの設定。UserWorkArea インターフェースの 2 つの引数を取る set メソッドは、1 つのキーと 1 つの値を引数として取り、標準のデフォルトのプロパティー・モードで プロパティーを挿入します。 プロパティーを別のモードで設定する場合、アプリケーションは、 3 つの引数を取る set メソッドを使用し、プロパティー・モードを 3 つ目の引数として受け取る 必要があります。 プロパティー・モードの要求に使用する値は以下のとおりです。
    • 標準: PropertyModeType.normal
    • 固定標準: PropertyModeType.fixed_normal
    • 読み取り専用: PropertyModeType.read_only
    • 固定読み取り専用: PropertyModeType.fixed_readonly
  4. 作業域でのローカル作業を管理します。
  5. 作業域を完了します。

    アプリケーションは、作業域の使用を終了した後に、UserWorkArea インターフェースの complete メソッドを呼び出して、その作業域を終了する必要があります。 これにより、呼び出し元のスレッドとの関連が終了 し、作業域は破棄されます。complete メソッドがネストされた作業域上に呼び出された場合、 ネストされた作業域は終了し、 親作業域が現行の作業域となります。 呼び出し元のスレッドに 関連付けられている作業域がない場合は、NoWorkArea 例外が作成されます。 すべての作業域には 終了処理が必要です。また作業域は親プロセスによってのみ終了できます。例えば、クライアント の作成した作業域でサーバーが complete メソッドを呼び出そうとした場合、NotOriginator 例外が作成されます。サーバー・プロセスで作成された作業域は、呼び出し元のクライアント・プロセスに戻されることはありません。

    重要: 作業域サービスはローカルとリモートの間の完全な透過性を要求します。 2 つの Bean が偶然同じサーバー内にデプロイされ、その結果、同じ JVM および プロセスにデプロイされた場合でも、他の作業域からの呼び出しで開始した作業域は完了し、いかなる リモート呼び出しの後でも要求元の Bean は常に同じ状態になります。

    次のコード例は、クライアント・アプリケーションで作成された作業域の終了を 示したものです。

    public class SimpleSampleServlet {
       ...
       userWorkArea.begin("SimpleSampleServlet");
       userWorkArea.set("company",
           SimpleSampleCompany.Main, PropertyModeType.read_only);
       userWorkArea.set("priority", SimpleSamplePriority.Silver);
       ...
    
       // Do application work.
       ...
    
       // Terminate the work area.
       try {
          userWorkArea.complete();
       }
    
       catch (NoWorkArea e) {
          // There is no work area associated with this thread.
          ...
       }
    
       catch (NotOriginator e) {
          // The work area was imported into this process.
          ...
       }
      ...
    }

    次のコード例は、リモート呼び出しで以前に作成した、ネストされた作業域を終了するサンプル・アプリケーションを示したものです。

    public class SimpleSampleBeanImpl implements SessionBean {
    
        public String [] test() {
          ...
    
          // Begin a nested work area.
          userWorkArea.begin("SimpleSampleBean");
          try {
            userWorkArea.set("company",
                             SimpleSampleCompany.London_Development);
          }
          catch (NotOriginator e) {
          }
    
          SimpleSampleCompany company =
             (SimpleSampleCompany) userWorkArea.get("company");
          SimpleSamplePriority priority =
             (SimpleSamplePriority) userWorkArea.get("priority");
    
          // Complete all nested work areas before returning.
          try {
            userWorkArea.complete();
          }
          catch (NoWorkArea e) {
          }
          catch (NotOriginator e) {
          }
       }
    }
    

作業域のオブジェクト型。 以下の例では、クライアントは作業域を作成し、その作業域に サイト ID と優先順位の 2 つのプロパティーを挿入しています。 サイト ID は読み取り専用プロパティーとして設定されます。クライアントは作業域の受信側が サイト ID をオーバーライドすることを禁止しています。このプロパティーは company キーと、SimpleSampleCompany オブジェクトの静的インスタンスから構成されています。 優先順位プロパティーは priority キーと、SimpleSamplePriority オブジェクトの静的インスタンスから構成されています。オブジェクト型は次のコード例で示しているように定義されます。

public static final class SimpleSampleCompany {
   public static final SimpleSampleCompany Main;
   public static final SimpleSampleCompany NewYork_Sales;
   public static final SimpleSampleCompany NewYork_Development;
   public static final SimpleSampleCompany London_Sales;
   public static final SimpleSampleCompany London_Development;
}

public static final class SimpleSamplePriority {
   public static final SimpleSamplePriority Platinum;
   public static final SimpleSamplePriority Gold;
   public static final SimpleSamplePriority Silver;
   public static final SimpleSamplePriority Bronze;
   public static final SimpleSamplePriority Tin;
}

クライアントはその後、リモート・オブジェクトに呼び出しを作成します。作業域は自動的に伝搬されます。リモート・オブジェクトのどのメソッドも、 作業域の引数を取りません。 リモート側では、まず SimpleSampleBean によって要求が処理されます。 SimpleSampleBean は最初に、作業域からサイト ID と優先順位プロパティーを読み取ります。 この Bean は次に、インポートした作業域への直接の書き込みと、 読み取り専用サイト ID プロパティーのオーバーライドを行おうとして、それに失敗します。

SimpleSampleBean は、ネストされた作業域を正常に開始して、クライアントの優先順位をオーバーライドし、 次に、もう 1 つの Bean である SimpleSampleBackendBean を呼び出します。 SimpleSampleBackendBean は、作業域からプロパティーを読み込みます。 この作業域は、クライアントに設定されたサイト ID と、SimpleSampleBean に設定された優先順位を含んでいます。 最後に、SimpleSampleBean はそのネストされた作業域を完了し、 サイト ID プロパティーに基づいたメッセージを書き込んで戻ります。

作業域区画マネージャーの使用。 以下のコード例は、作業域区画マネージャーのインターフェースの使用を示しています。 この例は、プログラマチックに作業域区画を作成およびリトリーブする 方法を示しています。ただし、作業域区画のプログラマチックな作成は、Java Platform, Enterprise Edition (Java EE) クライアントでのみ使用可能であることに ご注意ください。サーバー上で作業域区画を作成するには、管理コンソールを 使用する必要があります。区画を構成する上で使用可能な構成パラメーターについては、 『作業域区画サービス』の項を参照してください。

import com.ibm.websphere.workarea.WorkAreaPartitionManager;
import com.ibm.websphere.workarea.UserWorkArea;
import com.ibm.websphere.workarea.PartitionAlreadyExistsException;
import com.ibm.websphere.workarea.NoSuchPartitionException;
import java.lang.IllegalAccessError;
import java.util.Properties;
import javax.naming.InitialContext;

//This sample demonstrates how to retrieve an instance of the
//WorkAreaPartitionManager implementation and how to use that
//instance to create a WorkArea partition and retrieve a partition.
//NOTE: Creating a partition in the way listed is only available 
//on a J2EE client.  To create a partition on the server use the
//WebSphere administrative console.  Retrieving a WorkArea
//partition is performed in the same way on both client and server.

public class Example {

     //The name of the partition to create/retrieve
     String partitionName = "myPartitionName";
     //The name in java naming the WorkAreaPartitionManager instance is bound to
     String jndiName = "java:comp/websphere/WorkAreaPartitionManager";

     //On a J2EE client a user would create a partition as follows:
     public UserWorkArea myCreate(){
         //Variable to hold our WorkAreaPartitionManager reference
         WorkAreaPartitionManager partitionManager = null;
         //Get an instance of the WorkAreaPartitionManager implementation
         try {
             InitialContext initialContext = new InitialContext();
             partitionManager = (WorkAreaPartitionManager) initialContext.lookup(jndiName);
         } catch (Exception e) {  }

         //Set the properties to configure our WorkArea partition
         Properties props = new Properties();
         props.put("maxSendSize","12345");
         props.put("maxReceiveSize","54321");
         props.put("Bidirectional","true");
  			 			 props.put("DeferredAttributeSerialization","true");

         //Variable used to hold the newly created WorkArea Partition
         UserWorkArea myPartition = null;

         try{
             //This is the way to create a partition on the J2EE client.  Use the
                          //WebSphere Administrative Console to create a WorkArea Partition
                          //on the server.
             myPartition = partitionManager.createWorkAreaPartition(partitionName,props);
         }
         catch (PartitionAlreadyExistsException e){  }
         catch (IllegalAccessException e){  }

         return myPartition;
     }

     //. . . .

     //In order to retrieve a WorkArea partition at some time later or
     //from some other class, do the following (from client or server):
     public UserWorkArea myGet(){
         //Variable to hold our WorkAreaPartitionManager reference
         WorkAreaPartitionManager partitionManager = null;
         //Get an instance of the WorkAreaPartitionManager implementation
         try {
             InitialContext initialContext = new InitialContext();
             partitionManager = (WorkAreaPartitionManager) initialContext.lookup(jndiName);
         } catch (Exception e) {  }

         //Variable used to hold the retrieved WorkArea partition
         UserWorkArea myPartition = null;
         try{
             myPartition = partitionManager.getWorkAreaPartition(partitionName);
         }catch(NoSuchPartitionException e){  }

         return myPartition;
     }
}

次のタスク

作業域について詳しくは、API の『com.ibm.websphere.workarea パッケージ』を参照してください。 生成済み API 文書は、インフォメーション・センターの目次で、「参照」 > 「API - アプリケーション・プログラミング・インターフェース」の順にたどって入手できます。


トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twa_develop
ファイル名:twa_develop.html