以下の節では、アプリケーションでコンテキスト伝播 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 Fusion Middleware Oracle WebLogic Server スタンドアロン クライアントプログラマーズガイド』を参照してください。
アプリケーション (EJB、Web サービス、サーブレットなど) をさらに更新して WorkContextMap
を作成し、追加するコンテキストとユーザ データをクライアント アプリケーションから取得します。
「アプリケーションのコンテキスト伝播のプログラミング」を参照してください。
以下のサンプル Java コードでは、Web サービスを呼び出すスタンドアロン Java クライアントを示します。また、この例では、weblogic.workarea.*
コンテキスト伝播 API を使用してユーザ情報を呼び出しに関連付ける方法も示します。コンテキスト伝播に該当するコードを太字で示し、サンプルの後で説明を加えます。
コンテキスト伝播の完全な API マニュアルについては、「weblogic.workarea の Javadoc
」を参照してください。
注意 : Web サービスおよび Web サービスを呼び出すクライアント アプリケーションの詳細については、『Oracle Fusion Middleware JAX-WS を使用した Oracle WebLogic Server 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;
/** * WorkArea Web サービスの <code>sayHello</code> オペレーションを呼び出す * 単純なスタンドアロンのクライアント アプリケーション。 * */ 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");
// 文字列コンテキストを配置する
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.*
クラス、インタフェース、および例外をインポートする方法を示している。
prompt> java weblogic.DDConverter [options] archive_file_or_directory
次のコードは、コンテキスト伝播固有の JNDI 名 java:comp/WorkContextMap
の JNDI ルックアップを実行することで WorkContextMap
を作成する方法を示している。
prompt> java weblogic.DDConverter [options] archive_file_or_directory
次のコードは、PrimitiveContextFactory
を使用して WorkContext
を作成する方法を示している。この例では、WorkContext
は、単純な文字列値 A String Context
で構成されています。文字列値は、呼び出される Web サービスに渡されるユーザ データです。
prompt> java weblogic.DDConverter [options] archive_file_or_directory
最後に、次のコードは、キー SESSION_ID
とともにコンテキスト データを WorkContextMap
に追加し、それを現在のスレッドに関連付ける方法を示している。PropagationMode.SOAP
定数は、伝播が SOAP メッセージを介して発生するように指定します。これは、クライアントが Web サービスを呼び出しているためです。
prompt> java weblogic.DDConverter [options] archive_file_or_directory
以下のサンプル Java コードでは、Web サービスを実装する Java Web サービス (Java Web Service: JWS) ファイルを示します。JWS ファイルには、Web サービスの呼び出しに関連付けられるユーザ データを取得するためのコンテキスト伝播コードも含まれます。コンテキスト伝播に該当するコードを太字で示し、サンプルの後で説明を加えます。
コンテキスト伝播の完全な API マニュアルについては、「weblogic.workarea の Javadoc
」を参照してください。
注意 : Web サービスおよび Web サービスを呼び出すクライアント アプリケーションの詳細については、『Oracle Fusion Middleware JAX-WS を使用した Oracle WebLogic Server Web サービス入門』を参照してください。 |
package examples.workarea; import javax.naming.InitialContext; // コンテキスト伝播クラスをインポートする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") /** * この JWS ファイルは、1 つのオペレーション sayHello * を含む簡単な WebLogic Web サービスの基本となる * */ 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 インタフェースのみが要求されています。
prompt> java weblogic.DDConverter [options] archive_file_or_directory
次のコードは、コンテキスト伝播固有の JNDI 名 java:comp/WorkContextMap
の JNDI ルックアップを実行することで WorkContextMap
を作成する方法を示している。
prompt> java weblogic.DDConverter [options] archive_file_or_directory
次のコードは、キーを使用して現在の WorkContextMap
からコンテキストのユーザ データを取得する方法を示している。ここでは、キーは、Web サービスを呼び出したときにクライアント アプリケーションが設定したものと同じ SESSION_ID
です。
prompt> java weblogic.DDConverter [options] archive_file_or_directory