Oracle® Fusion Middleware Oracle WebLogic Serverアプリケーションの開発 11g リリース1(10.3.4) B60990-02 |
|
前 |
次 |
次の項では、アプリケーションでコンテキスト伝播APIを使用する方法を説明します。
コンテキストの伝播により、プログラマは情報をアプリケーションと関連付けできます。情報はその後、すべてのリクエストと共に伝えられます。さらに、下流のコンポーネントは、この情報を送り元に戻せるように、情報に対し追加または修正を行えます。コンテキストの伝播は、作業領域、作業コンテキスト、またはアプリケーション・トランザクションとしても知られています。
通常、コンテキストの伝播を使用するのは、アプリケーションの不可欠な一部である情報ではなく、アプリケーションの外部に情報を運ぶ必要があるアプリケーションです。たとえば、診断モニター、アプリケーション・トランザクション、アプリケーションのロード・バランシングなどがそれに当たります。アプリケーションの外部にこの種類の情報を保持すると、不要な場合にAPIを使用しないようにしてアプリケーション自体の形を整えておくことができます。また、サード・パーティ・コンポーネントなどの読取り専用コンポーネントに情報を追加することもできます。
コンテキスト伝播のプログラミングでは、最初にWorkContextMap
とWorkContext
を作成するクライアント・アプリケーションのコードを記述し、次にこのデータを取得および必要に応じて使用する呼出し対象のアプリケーション自体のコードを記述します。呼出し対象のアプリケーションは、EJB、Webサービス、サーブレット、JMSトピックまたはキューなど、どのような種類のものでも構いません。詳細は、「コンテキスト伝播のプログラミング:主な手順」を参照してください。
WebLogicコンテキスト伝播APIはweblogic.workarea
パッケージにあります。次の表に、主なインタフェースとクラスを示します。
表11-1 WebLogicコンテキスト伝播APIのインタフェースとクラス
インタフェースまたはクラス | 説明 |
---|---|
|
アプリケーションにデータを付け、アプリケーション・リクエストを介してその情報を伝播するコンテキスト伝播のメイン・インタフェース。 |
|
アプリケーションとともに渡されるユーザー・データのマーシャリングおよびアンマーシャリングに使用するインタフェース。このインタフェースには、単純な8ビットASCIIコンテキスト(
|
|
|
|
|
|
プリミティブ・データのみを格納する |
コンテキスト伝播の完全なAPIドキュメントについては、「weblogic.workareaのJavadoc」
を参照してください。
以下は、アプリケーション内でコンテキスト伝播を使用する高度な手順です。この手順では、反復的な開発環境を設定済みで、weblogic.workarea
APIを使用してコンテキスト伝播を使用するよう更新する既存のクライアントおよびアプリケーションがあることを前提にしています。
クライアント・アプリケーションを更新してWorkContextMap
オブジェクトとWorkContext
オブジェクトを作成し、ユーザー・データをコンテキストに追加します。
「クライアントのコンテキスト伝播のプログラミング」を参照してください。
クライアント・アプリケーションが(WebLogic ServerにデプロイされたJava EEコンポーネントで実行されるのではなく)スタンドアロンの場合、そのCLASSPATHにJava EEアプリケーション・クライアント(シン・クライアント)が含まれるようにします。
『Oracle WebLogic Serverスタンドアロン・クライアントのプログラミング』を参照してください。
アプリケーション(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; } } }
上記の例では:
次のコードは、必要なweblogic.workarea.*
クラス、インタフェース、および例外をインポートする方法を示しています。
import weblogic.workarea.WorkContextMap;
import weblogic.workarea.WorkContext;
import weblogic.workarea.PrimitiveContextFactory;
import weblogic.workarea.PropagationMode;
import weblogic.workarea.PropertyReadOnlyException;
次のコードは、コンテキスト伝播固有の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");
最後に、次のコードは、キーSESSION_ID
とともにコンテキスト・データをWorkContextMap
に追加し、それを現在のスレッドに関連付ける方法を示しています。PropagationMode.SOAP
定数は、伝播がSOAPメッセージを介して発生するように指定します。これは、クライアントがWebサービスを呼び出しているためです。
map.put(SESSION_ID, stringContext, PropagationMode.SOAP);
以下のサンプル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 classesimport 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"; } } }
上記の例では:
次のコードは、必要なコンテキスト伝播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");
次のコードは、キーを使用して現在のWorkContextMap
からコンテキストのユーザー・データを取得する方法を示しています。ここでは、キーは、Webサービスを呼び出したときにクライアント・アプリケーションが設定したものと同じSESSION_ID
です。
WorkContext localwc = map.get(SESSION_ID);