| Oracle® Fusion Middleware Oracle WebLogic Server 12.1.3アプリケーションの開発 12c (12.1.3) E57574-04 |
|
![]() 前 |
![]() 次 |
この章では、WebLogic Server 12.1.3のアプリケーションでコンテキスト伝播APIを使用する方法を説明します。
この章の内容は次のとおりです。
コンテキストの伝播により、プログラマは情報をアプリケーションと関連付けできます。さらに、下流のコンポーネントは、この情報を送り元に戻せるように、情報に対し追加または修正を行えます。コンテキストの伝播では、WorkContextを介してリクエストに情報をアタッチします。この情報は、PropagationModeを介して、コンテキスト伝播をサポートしている任意のプロセスにリクエストとともに伝えられます。コンテキストの伝播は、作業領域、作業コンテキスト、またはアプリケーション・トランザクションとしても知られています。
通常、コンテキストの伝播を使用するのは、アプリケーションの不可欠な一部である情報ではなく、アプリケーションの外部または別のアプリケーションに情報(通常はリクエストに関連する情報)を運ぶ必要があるアプリケーションです。たとえば、診断モニター、アプリケーション・トランザクション、アプリケーションのロード・バランシングなどがそれに当たります。コンテキストの伝播ではリクエストに情報を関連付けることができるので、データ管理が大幅に簡素化されます。これは、アプリケーションごとにリクエスト・データのマップを保持し、カスタム・コードを実装してアプリケーション間またはスレッド間で情報を伝送する方法とは対照的です。
コンテキスト伝播はアプリケーション内で発生することがあります。たとえば、アプリケーションからワーク・マネージャ経由で作業が送信されると、処理の一部が別のスレッド内で発生します。コンテキスト伝播で別のスレッドに情報を伝送するには、PropagationModeを使用します。
コンテキスト伝播のプログラミングでは、最初にWorkContextMapとWorkContextを作成するクライアント・アプリケーションのコードを記述し、次にこのデータを取得および必要に応じて使用する呼出し対象のアプリケーション自体のコードを記述します。呼出し対象のアプリケーションは、EJB、Webサービス、サーブレット、JMSトピックまたはキューなど、どのような種類のものでも構いません。詳細は、「コンテキスト伝播のプログラミング: 主な手順」を参照してください。
WebLogicコンテキスト伝播APIはweblogic.workareaパッケージにあります。次の表に、主なインタフェースとクラスを示します。
表14-1 WebLogicコンテキスト伝播APIのインタフェースとクラス
| インタフェースまたはクラス | 説明 |
|---|---|
|
|
アプリケーションにデータを付け、アプリケーション・リクエストを介してその情報を伝播するコンテキスト伝播のメイン・インタフェース。 |
|
|
アプリケーションとともに渡されるユーザー・データのマーシャリングおよびアンマーシャリングに使用するインタフェース。このインタフェースには、単純な8ビットASCIIコンテキスト(
|
|
|
|
|
|
|
|
|
プリミティブ・データのみを格納する |
コンテキスト伝播の完全なAPIドキュメントについては、「weblogic.workareaのJavadoc」を参照してください。
次に、WebLogic Serverでコンテキスト伝播を使用する高度な手順について説明します。この例では、クライアント上で情報をリクエストに関連付ける方法、サーバー上でその情報を取得する方法、およびサーバー・インスタンスによって更新された値を取得する方法について説明します。この手順では、反復的な開発環境を設定済みで、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サービスとそれらを呼び出すクライアント・アプリケーションの作成の詳細は、『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 contextmap.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.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 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);