15 コンテキスト伝播のプログラミング
この章の内容は次のとおりです。
- コンテキストの伝播の理解
コンテキストの伝播により、プログラマは情報をアプリケーションと関連付けることができ、その情報はその後、すべてのリクエストに継承されます。さらに、下流のコンポーネントは、この情報を送り元に戻せるように、情報に対し追加または修正を行えます。 - コンテキスト伝播のプログラミング: 主なステップ
クライアント上で情報をリクエストに関連付け、サーバー上でその情報を取得し、コンテキスト伝播を使用してサーバー・インスタンスによって更新された値を取得することができます。 - クライアントのコンテキスト伝播のプログラミング
クライアントがアプリケーションを呼び出すと「関連付けられた」ユーザー情報を取得するようにコンテキスト伝播をプログラミングできます。 - アプリケーションのコンテキスト伝播のプログラミング
アプリケーションを呼び出すとユーザー・データおよび他の関連情報を取得するようにコンテキスト伝播をプログラミングできます。
コンテキストの伝播の理解
コンテキストの伝播により、プログラマは情報をアプリケーションと関連付けできます。情報はその後、すべてのリクエストとともに継承されます。さらに、下流のコンポーネントは、この情報を送り元に戻せるように、情報に対し追加または修正を行えます。
コンテキストの伝播では、WorkContext
を介してリクエストに情報をアタッチします。この情報は、PropagationMode
を介して、コンテキスト伝播をサポートしている任意のプロセスにリクエストとともに伝えられます。コンテキストの伝播は、作業領域、作業コンテキスト、またはアプリケーション・トランザクションとしても知られています。
通常、コンテキストの伝播を使用するのは、アプリケーションの不可欠な一部である情報ではなく、アプリケーションの外部または別のアプリケーションに情報(通常はリクエストに関連する情報)を運ぶ必要があるアプリケーションです。たとえば、診断モニター、アプリケーション・トランザクション、アプリケーションのロード・バランシングなどがそれに当たります。コンテキストの伝播ではリクエストに情報を関連付けることができるので、データ管理が大幅に簡素化されます。これは、アプリケーションごとにリクエスト・データのマップを保持し、カスタム・コードを実装してアプリケーション間またはスレッド間で情報を伝送する方法とは対照的です。
コンテキスト伝播はアプリケーション内で発生することがあります。たとえば、アプリケーションからワーク・マネージャ経由で作業が送信されると、処理の一部が別のスレッド内で発生します。コンテキスト伝播で別のスレッドに情報を伝送するには、PropagationMode
を使用します。
コンテキスト伝播のプログラミングでは、最初にWorkContextMap
とWorkContext
を作成するクライアント・アプリケーションのコードを記述し、次にこのデータを取得および必要に応じて使用する呼出し対象のアプリケーション自体のコードを記述します。呼出し対象のアプリケーションは、EJB、Webサービス、サーブレット、JMSトピックまたはキューなど、どのような種類のものでも構いません。詳細は、「コンテキスト伝播のプログラミング: 主なステップ」を参照してください。
WebLogicコンテキスト伝播APIはweblogic.workarea
パッケージにあります。次の表に、主なインタフェースとクラスを示します。
表15-1 WebLogicコンテキスト伝播APIのインタフェースとクラス
インタフェースまたはクラス | 説明 |
---|---|
|
アプリケーションにデータを付け、アプリケーション・リクエストを介してその情報を伝播するコンテキスト伝播のメイン・インタフェース。 |
|
アプリケーションとともに渡されるユーザー・データのマーシャリングおよびアンマーシャリングに使用するインタフェース。このインタフェースには、単純な8ビットASCIIコンテキスト(
|
|
|
|
|
|
プリミティブ・データのみを格納する |
コンテキスト伝播の完全なAPIドキュメントについては、「weblogic.workareaのJavadoc」
を参照してください。
親トピック: コンテキスト伝播のプログラミング
コンテキスト伝播のプログラミング: 主なステップ
クライアント上で情報をリクエストに関連付け、サーバー上でその情報を取得し、コンテキスト伝播を使用してサーバー・インスタンスによって更新された値を取得することができます。
次に、WebLogic Serverでコンテキスト伝播を使用する主要なステップについて説明します。この例では、クライアント上で情報をリクエストに関連付ける方法、サーバー上でその情報を取得する方法、およびサーバー・インスタンスによって更新された値を取得する方法について説明します。この手順では、反復的な開発環境を設定済みで、weblogic.workarea
APIを使用してコンテキスト伝播を使用するよう更新する既存のクライアントおよびアプリケーションがあることを前提にしています。
親トピック: コンテキスト伝播のプログラミング
クライアントのコンテキスト伝播のプログラミング
クライアントがアプリケーションを呼び出すと「関連付けられた」ユーザー情報を取得するようにコンテキスト伝播をプログラミングできます。
次のサンプルJavaコードでは、Webサービスを呼び出すスタンドアロンJavaクライアントを示します。また、この例では、weblogic.workarea.*
コンテキスト伝播APIを使用してユーザー情報を呼出しに関連付ける方法も示します。コンテキスト伝播に該当するコードを太字で示し、サンプルの後で説明を加えます。
コンテキスト伝播の完全なAPIドキュメントについては、「weblogic.workareaのJavadoc」
を参照してください。
ノート:
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 your 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{ YourWorkAreaService service = new YourWorkAreaService(args[0] + "?WSDL"); YourWorkAreaPortType 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; } } }
上記の例では:
-
次のコードは、必要な
weblogic.workarea.*
クラス、インタフェース、および例外をインポートする方法を示しています。import weblogic.workarea.WorkContextMap;
import weblogic.workarea.WorkContext;
import weblogic.workarea.PrimitiveContextFactory;
import weblogic.workarea.PropagationMode;
import weblogic.workarea.PropertyReadOnlyException;
-
YourWorkAreaService
およびYourWorkAreaPortType
に、WebサービスのWorkArea
のサービスとポートの実装を代入します。 -
次のコードは、コンテキスト伝播固有のJNDI名
java:comp/WorkContextMap
のJNDIルックアップを実行することでWorkContextMap
を作成する方法を示しています。WorkContextMap map = (WorkContextMap)
new InitialContext().lookup("java:comp/WorkContextMap"); -
次のコードは、
PrimitiveContextFactory
を使用してWorkContext
を作成する方法を示しています。この例では、WorkContext
は、単純な文字列値A String Context
で構成されています。文字列値は、呼び出されるWebサービスに渡されるユーザー・データです。WorkContext stringContext = PrimitiveContextFactory.create("A String Context");
-
次のコードは、
stringContext
をSESSION_ID
キーでWorkContextMap
に保存します。伝播モードのSOAP
を指定すると、stringContext
の伝播はSOAP
メッセージを介して、コンテキスト伝播をサポートしているサーバーに送信されます。map.put(SESSION_ID, stringContext, PropagationMode.SOAP);
親トピック: コンテキスト伝播のプログラミング
アプリケーションのコンテキスト伝播のプログラミング
アプリケーションを呼び出すとユーザー・データおよび他の関連情報を取得するようにコンテキスト伝播をプログラミングできます。
次のサンプルJavaコードでは、Webサービスを実装するシンプルなJava Webサービス(Java Web Service: JWS)ファイルを示します。JWSファイルには、Webサービスの呼出しに関連付けられるユーザー・データを取得するためのコンテキスト伝播コードも含まれます。コンテキスト伝播に該当するコードを太字で示し、サンプルの後で説明を加えます。
コンテキスト伝播の完全なAPIドキュメントについては、「weblogic.workareaのJavadoc」
を参照してください。
ノート:
Webサービスとそれらを呼び出すクライアント・アプリケーションの作成の詳細は、『Oracle WebLogic Server JAX-WS Webサービスの開発』を参照してください。
package examples.workarea; import javax.naming.InitialContext; // Import the Context Propagation classesimport weblogic.workarea;
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 WorkContextAwareWebService { 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);
WorkContext modifiedLocalWC = PrimitiveContextFactory.create(localwc.get() + " could be replaced by a new value...");
map.put(SESSION_ID, newLocalWC, PropagationMode.SOAP); System.out.println("local context: " + localwc); System.out.println("sayHello: " + message); return "The server received message: " + message + ", with SESSION_ID: " + localwc; } catch (Throwable t) { return "error"; } } }
上記の例では:
-
次のコードは、必要なコンテキスト伝播APIをインポートする方法を示しています。ここでは、WorkContextMapインタフェースとWorkContextインタフェースのみが要求されています。
import weblogic.workarea.WorkContextMap; import weblogic.workarea.WorkContext;
-
次のコードは、コンテキスト伝播固有のJNDI名
java:comp/WorkContextMap
のJNDIルックアップを実行することでWorkContextMap
を作成する方法を示しています。WorkContextMap map = (WorkContextMap) new InitialContext().lookup("java:comp/WorkContextMap");
-
伝播モードは
SOAP
のみで、サーバーにはリクエストの伝播が、クライアントにはレスポンスの伝播がそれぞれ発生します。次のコードは、サーバー・インスタンスでstringContext
を変更する方法を示しています。WorkContext modifiedLocalWC = PrimitiveContextFactory.create(localwc.get() + " could be replaced by a new value...");
-
次のコードは、作業コンテキストを更新された値で置換します。サーバーからレスポンスが返された後、クライアント上で
SESSION_ID
を取得すると、サーバーによって更新された値がクライアントで表示されるようになります。map.put(SESSION_ID, newLocalWC, PropagationMode.SOAP);
親トピック: コンテキスト伝播のプログラミング