ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Serverアプリケーションの開発
12c リリース1 (12.1.1)
B65893-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

13 コンテキスト伝播のプログラミング

この章では、アプリケーションでコンテキスト伝播APIを使用する方法を説明します。

この章の内容は以下のとおりです。

コンテキストの伝播について

コンテキストの伝播により、プログラマは情報をアプリケーションと関連付けできます。さらに、下流のコンポーネントは、この情報を送り元に戻せるように、情報に対し追加または修正を行えます。コンテキストの伝播は、作業領域作業コンテキスト、またはアプリケーション・トランザクションとしても知られています。

通常、コンテキストの伝播を使用するのは、アプリケーションの不可欠な一部である情報ではなく、アプリケーションの外部に情報を運ぶ必要があるアプリケーションです。たとえば、診断モニター、アプリケーション・トランザクション、アプリケーションのロード・バランシングなどがそれに当たります。アプリケーションの外部にこの種類の情報を保持すると、無関係なAPIを使用しないでアプリケーション自体をクリーンにしておくことができます。また、サード・パーティ・コンポーネントなどの読取り専用コンポーネントに情報を追加することもできます。

コンテキスト伝播のプログラミングでは、最初にWorkContextMapWorkContextを作成するクライアント・アプリケーションのコードを記述し、次にこのデータを取得および必要に応じて使用する呼出し対象のアプリケーション自体のコードを記述します。呼出し対象のアプリケーションは、EJB、Webサービス、サーブレット、JMSトピックまたはキューなど、どのような種類のものでも構いません。詳細は、「コンテキスト伝播のプログラミング: 主な手順」を参照してください。

WebLogicコンテキスト伝播APIはweblogic.workareaパッケージにあります。次の表に、主なインタフェースとクラスを示します。

表13-1 WebLogicコンテキスト伝播APIのインタフェースとクラス

インタフェースまたはクラス 説明

WorkContextMapインタフェース

アプリケーションにデータを付け、アプリケーション・リクエストを介してその情報を伝播するコンテキスト伝播のメイン・インタフェース。WorkContextMapsは、クライアントまたはアプリケーションのJNDI環境の一部で、java:comp/WorkContextMapという名前をルックアップしてJNDIからアクセスできます。

WorkContextインタフェース

アプリケーションとともに渡されるユーザー・データのマーシャリングおよびアンマーシャリングに使用するインタフェース。このインタフェースには、単純な8ビットASCIIコンテキスト(AsciiWorkContext)、longコンテキスト(LongWorkContext)、Serializableコンテキスト(SerializableWorkContext)、Stringコンテキスト(StringWorkContext)のデータをマーシャリングおよびアンマーシャリングするために4つの実装クラスがあります。

WorkContextには、PrimitiveWorkContextというサブインタフェースが1つあります。これは、特に単独のプリミティブ・データ項目をマーシャリングおよびアンマーシャリングする場合に使用します。

WorkContextOutput/Inputインタフェース

WorkContext実装をそれぞれマーシャリングおよびアンマーシャリングするためのプリミティブ・ストリームを表すインタフェース。

PropagationModeインタフェース

WorkContextsの伝播プロパティを定義します。WorkContextがローカルで伝播されるか、スレッド間で伝播されるか、RMI呼出し間で伝播されるか、JMSキューおよびトピック間で伝播されるか、SOAPメッセージ間で伝播されるかを指定します。指定しなかった場合のデフォルトは、同一スレッド内のリモート呼出しとローカル呼出し間でデータを伝播します。

PrimitiveContextFactoryクラス

プリミティブ・データのみを格納するWorkContextsを作成するためのコンビニエンス・クラス。


コンテキスト伝播の完全なAPIドキュメントについては、「weblogic.workareaのJavadoc」を参照してください。

コンテキスト伝播のプログラミング:主な手順

以下は、アプリケーション内でコンテキスト伝播を使用する高度な手順です。この手順では、反復的な開発環境を設定済みで、weblogic.workarea APIを使用してコンテキスト伝播を使用するよう更新する既存のクライアントおよびアプリケーションがあることを前提にしています。

  1. クライアント・アプリケーションを更新してWorkContextMapオブジェクトとWorkContextオブジェクトを作成し、ユーザー・データをコンテキストに追加します。

    「クライアントのコンテキスト伝播のプログラミング」を参照してください。

  2. クライアント・アプリケーションが(WebLogic ServerにデプロイされたJava EEコンポーネントで実行されるのではなく)スタンドアロンの場合、そのCLASSPATHにJava EEアプリケーション・クライアント(シン・クライアントともいいます)が含まれるようにします。

    『Oracle WebLogic Serverスタンドアロン・クライアントのプログラミング』を参照してください。

  3. アプリケーション(EJB、Webサービス、サーブレットなど)をさらに更新してWorkContextMapを作成し、追加するコンテキストとユーザー・データをクライアント・アプリケーションから取得します。

    「アプリケーションのコンテキスト伝播のプログラミング」を参照してください。

クライアントのコンテキスト伝播のプログラミング

次のサンプルJavaコードでは、Webサービスを呼び出すスタンドアロンJavaクライアントを示します。また、この例では、weblogic.workarea.*コンテキスト伝播APIを使用してユーザー情報を呼出しに関連付ける方法も示します。コンテキスト伝播に該当するコードを太字で示し、サンプルの後で説明を加えます。

コンテキスト伝播の完全なAPIドキュメントについては、「weblogic.workareaのJavadoc」を参照してください。


注意:

WebサービスおよびWebサービスを呼び出すクライアント・アプリケーション作成の詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』を参照してください。


package examples.workarea.client;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.Stub;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import weblogic.workarea.WorkContextMap;
import weblogic.workarea.WorkContext;
import weblogic.workarea.PrimitiveContextFactory;
import weblogic.workarea.PropagationMode;
import weblogic.workarea.PropertyReadOnlyException;
/**
 * This is a simple standalone client application that invokes the
 * the <code>sayHello</code> operation of the WorkArea Web service.
 *
 */
public class Main {
  public final static String SESSION_ID= "session_id_key";
  public static void main(String[] args)
      throws ServiceException, RemoteException, NamingException, PropertyReadOnlyException{
    WorkAreaService service = new WorkAreaService_Impl(args[0] + "?WSDL");
    WorkAreaPortType port = service.getWorkAreaPort();
    WorkContextMap map = (WorkContextMap)new InitialContext().lookup("java:comp/WorkContextMap");
    WorkContext stringContext = PrimitiveContextFactory.create("A String Context");
    // Put a string context
    map.put(SESSION_ID, stringContext, PropagationMode.SOAP);
    try {
      String result = null;
      result = port.sayHello("Hi there!");
      System.out.println( "Got result: " + result );
    } catch (RemoteException e) {
      throw e;
    }
  }
}

上記の例では:

アプリケーションのコンテキスト伝播のプログラミング

次のサンプルJavaコードでは、Webサービスを実装するシンプルなJava Webサービス(Java Web Service: JWS)ファイルを示します。JWSファイルには、Webサービスの呼出しに関連付けられるユーザー・データを取得するためのコンテキスト伝播コードも含まれます。コンテキスト伝播に該当するコードを太字で示し、サンプルの後で説明を加えます。

コンテキスト伝播の完全なAPIドキュメントについては、「weblogic.workareaのJavadoc」を参照してください。


注意:

WebサービスおよびWebサービスを呼び出すクライアント・アプリケーション作成の詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』を参照してください。


package examples.workarea;
import javax.naming.InitialContext;
// Import the Context Propagation classes
import weblogic.workarea.WorkContextMap;
import weblogic.workarea.WorkContext;
import javax.jws.WebMethod;
import javax.jws.WebService;
import weblogic.jws.WLHttpTransport;
@WebService(name="WorkAreaPortType", 
            serviceName="WorkAreaService",
             targetNamespace="http://example.org")
@WLHttpTransport(contextPath="workarea", 
                 serviceUri="WorkAreaService",
                  portName="WorkAreaPort")
/**
 * This JWS file forms the basis of simple WebLogic
 * Web service with a single operation: sayHello
 *
 */
public class WorkAreaImpl {
  public final static String SESSION_ID = "session_id_key";
  @WebMethod()
  public String sayHello(String message) {
   try {
    WorkContextMap map = (WorkContextMap) new InitialContext().lookup("java:comp/WorkContextMap");
    WorkContext localwc = map.get(SESSION_ID);
    System.out.println("local context: " + localwc);
    System.out.println("sayHello: " + message);
    return "Here is the message: '" + message + "'";
   } catch (Throwable t) {
    return "error";
   }
  }
}

上記の例では: