Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS を使用した Web サービスの高度な機能のプログラミング 11g リリース 1 (10.3.1) B55543-01 |
|
戻る |
次へ |
以下の節では、コールバックを使用してクライアントにイベントを通知する方法について説明します。
コールバックとは、クライアントとサービスの間の規約の 1 つです。サービスはコールバックを使用することで、クライアントに追加のデータを照会することを目的として、サービス メソッドの呼び出しの間にクライアント提供のエンドポイントでオペレーションを呼び出すことができます。これにより、クライアントが動作を注入したり、クライアントに進行状況を通知したりすることが可能になります。サービスは、コールバックのポート タイプを定義する WSDL を使用してコールバックの要件を公開します。一方クライアントは、WS-Addressing を使用して、コールバック エンドポイントのアドレスをサービスに通知します。
この節で説明するコールバック実装のサンプルは、以下の 3 つの Java ファイルから構成されています。
コールバック Web サービスを実装する JWS ファイル : コールバック Web サービスは、コールバック メソッドを定義します。この実装から対象 Web サービスに情報が返送され、最終的にクライアント Web サービスに返送されます。
この節で示すサンプルでは、コールバック Web サービスの名前を CallbackService
としています。この Web サービスには、単一のコールバック メソッド、callback()
が定義されています。
対象 Web サービスを実装する JWS ファイル : 対象 Web サービスには、コールバック Web サービスに定義されたメソッドを呼び出す 1 つまたは複数の標準オペレーションが含まれます。対象 Web サービス オペレーションの呼び出し元であるクライアント Web サービスには、対象 Web サービスからメッセージが返送されます。
例では、この Web サービスの名前が TargetService
になっており、単一の標準メソッド targetOperation()
が定義されています。
クライアント Web サービスを実装する JWS ファイル : クライアント Web サービスは、対象 Web サービスのオペレーションを呼び出します。多くの場合、この Web サービスには、コールバック メソッドを介して対象 Web サービスからコールバック メッセージを受け取ったときにクライアントが実行すべき動作を指定する 1 つまたは複数のメソッドが含まれます。
サンプルでは、この Web サービスの名前を CallerService
としています。call()
は、TargetService
を標準の方法で呼び出すメソッドです。
次の図に、コールバック実装のサンプルでのメッセージの流れを示します。
ある WebLogic Server インスタンスで実行されている CallerService
Web サービスの call()
メソッドが、TargetService
の targetOperation()
メソッドを明示的に呼び出し、CallbackService
に Web サービスのエンドポイントを渡します。通常、TargetService
サービスは、別の WebLogic Server インスタンスで実行されています。
TargetService.targetOperation()
メソッドの実装が、メソッドの呼び出し時に CallerService
から渡された Web サービス コールバックを使用して、コールバック サービスを実装する CallbackService
の callback()
メソッドを明示的に呼び出します。
CallbackService.callback()
メソッドが、TargetService
Web サービスに情報を返送します。
最終的に、TargetService.targetOperation()
メソッドが情報を CallerService
サービスに返送し、コールバック シーケンスが完了します。
この節では、コールバックを実装するために必要な 3 つの JWS ファイル (対象 Web サービス、クライアント Web サービス、コールバック Web サービス) をプログラミングおよびコンパイルする方法について説明します。この手順では、これらの JWS ファイルをゼロから作成する方法を示しています。既存の JWS ファイルを更新する場合は、この手順をガイドとして利用してください。
Ant ベースの開発環境を設定済みであり、かつ jwsc
Ant タスクを実行して、Web サービスをデプロイするためのターゲットを追加できる、作業用の build.xml
ファイルがあることが前提となっています。詳細については、『Oracle Fusion Middleware JAX-WS を使用した Oracle WebLogic Server Web サービス入門』を参照してください。
表 4-1 コールバックのプログラミング手順
# |
手順 | 説明 |
---|---|---|
1 |
対象 Web サービスを実装する、新しい JWS ファイルを作成するか、既存の JWS ファイルを更新する。 |
使い慣れた IDE またはテキスト エディタを使用します。「対象 Web サービスのプログラミングのガイドライン」を参照してください。 注意 : 対象 Web サービスを実装する JWS ファイルは、コールバック Web サービスの 1 つまたは複数のコールバック メソッドを呼び出します。ただし、コールバック Web サービスをプログラミングする手順については後ほど説明します。したがって、これらの 3 つの JWS ファイルは、この手順に従って順番にプログラミングするのではなく、すべてを同時にプログラミングすることをお勧めします。手順をこの順番に説明しているのは、あくまで各手順を理解しやすくするためです。 |
2 |
|
「対象 Web サービスの build.xml ファイルの更新」を参照してください。 |
3 |
Ant ターゲットを実行して、対象 Web サービスをビルドする。 |
次に例を示します。 prompt> ant build-target |
4 |
対象 Web サービスを、通常どおりデプロイする。 |
『Oracle Fusion Middleware JAX-WS を使用した Oracle WebLogic Server Web サービス入門』の「WebLogic Web サービスのデプロイとアンデプロイ」を参照してください。 |
5 |
クライアント Web サービスを実装する、新しい JWS ファイルを作成するか、既存の JWS ファイルを更新する。 |
クライアント Web サービスは、対象 Web サービスをホストするものとは別の WebLogic Server インスタンスにデプロイされていることが前提となっています。「コールバック クライアント Web サービスのプログラミングのガイドライン」を参照してください。 |
6 |
コールバック Web サービスを実装する JWS ファイルを作成する。 |
「コールバック Web サービスのプログラミングのガイドライン」を参照してください。 |
7 |
クライアント Web サービスをビルドする |
クライアント Web サービスをビルドする <clientgen type="JAXWS" wsdl="${awsdl}" packageName="jaxws.callback.client.add"/> <clientgen type="JAXWS" wsdl="${twsdl}" packageName="jaxws.callback.client.target"/> <FileSet dir="." > <include name="CallbackWS.java" /> </FileSet> |
8 |
Ant ターゲットを実行して、クライアントおよびコールバック Web サービスをビルドする。 |
次に例を示します。 prompt> ant build-caller |
9 |
クライアント Web サービスを、通常どおりデプロイする。 |
『Oracle Fusion Middleware JAX-WS を使用した Oracle WebLogic Server Web サービス入門』の「WebLogic Web サービスのデプロイとアンデプロイ」を参照してください。 |
次のサンプルでは、対象 Web サービスを実装する簡単な JWS ファイルを示します。太字で示された Java コードに対応するコーディングのガイドラインについては、サンプルの後の説明を参照してください。
package examples.webservices.callback; import javax.jws.WebService; import javax.xml.ws.BindingType; import javax.xml.ws.wsaddressing.W3CEndpointReference; import examples.webservices.callback.callbackservice.*; @WebService( portName="TargetPort", serviceName="TargetService", targetNamespace="http://example.oracle.com", endpointInterface= "examples.webservices.callback.target.TargetPortType", wsdlLocation="/wsdls/Target.wsdl") @BindingType(value="http://schemas.xmlsoap.org/wsdl/soap/http") public class TargetImpl { public String targetOperation(String s, W3CEndpointReference callback) { CallbackService aservice = new CallbackService(); CallbackPortType aport = aservice.getPort(callback, CallbackPortType.class); String result = aport.callback(s); return result + " processed by target"; } }
対象 Web サービスを実装する JWS ファイルをプログラミングする際には、以下のガイドラインに従います。ガイドラインのサンプル コードは、上述のサンプルでは太字で示されています。
コールバック サービスのエンドポイントを渡すために必要なパッケージをインポートし、CallbackService
スタブ実装にアクセスする。
import javax.xml.ws.wsaddressing.W3CEndpointReference; import examples.webservices.callback.callbackservice.*;
このスタブ実装を使用して CallbackService
実装のインスタンスを作成し、呼び出し側アプリケーション (CallerService
) から渡された CallbackService
サービスのエンドポイントを渡すことでポートを取得する。
CallbackService aservice = new CallbackService(); CallbackPortType aport = aservice.getPort(callback, CallbackPortType.class);
インスタンス化したポートを使用して、CallbackService
のコールバック オペレーションを呼び出す。
String result = aport.callback(s);
結果を CallerService
サービスに返す。
return result + " processed by target";
次のサンプルでは、「対象 Web サービスのプログラミングのガイドライン」で説明した対象 Web サービスを呼び出すクライアント Web サービス用の簡単な JWS ファイルを示します。太字で示された Java コードに対応するコーディングのガイドラインについては、サンプルの後の説明を参照してください。
package examples.webservices.callback; import javax.annotation.Resource; import javax.jws.WebMethod; import javax.jws.WebService; import javax.xml.ws.BindingType; import javax.xml.ws.Endpoint; import javax.xml.ws.WebServiceContext; import javax.xml.ws.WebServiceException; import javax.xml.ws.WebServiceRef; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.wsaddressing.W3CEndpointReference; import examples.webservices.callback.target.*; @WebService( portName="CallerPort", serviceName="CallerService", targetNamespace="http://example.oracle.com") @BindingType(value="http://schemas.xmlsoap.org/wsdl/soap/http") public class CallerImpl { @Resource private WebServiceContext context; @WebServiceRef() private TargetService target; @WebMethod() public String call(String s) { Object sc = context.getMessageContext().get(MessageContext.SERVLET_CONTEXT); Endpoint callbackImpl = Endpoint.create(new CallbackWS()); callbackImpl.publish(sc); TargetPortType tPort = target.getTargetPort(); String result = tPort.targetOperation(s, callbackImpl.getEndpointReference(W3CEndpointReference.class)); callbackImpl.stop(); return result; } }
対象 Web サービスを呼び出す JWS ファイルをプログラミングする際には、以下のガイドラインに従います。ガイドラインのサンプル コードは、上述のサンプル内では太字で示されています。
サーブレット コンテキストにアクセスするために必要なパッケージをインポートし、Web サービスのエンドポイントをパブリッシュして TargetService
スタブ実装にアクセスする。
import javax.xml.ws.Endpoint; import javax.xml.ws.WebServiceContext; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.wsaddressing.W3CEndpointReference; import examples.webservices.callback.target.*;
WebServiceContext
および MessageContext
を使用してサーブレットコンテキストを取得する。サーブレット コンテキストは、後ほど Web サービスのエンドポイントをパブリッシュする際に使用します。
@Resource private WebServiceContext context; . . . Object sc context.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
WebServiceContext
およびMessageContext
を使用して実行時情報のアクセスに関する詳細については、『Oracle Fusion Middleware JAX-WS を使用した Oracle WebLogic Server Web サービス入門』の「Web サービスの実行時情報へのアクセス」を参照してください。
CallbackService
実装に渡す Web サービスのエンドポイントを作成し、受信した要求を受け入れるためにエンドポイントをパブリッシュする。
Endpoint callbackImpl = Endpoint.create(new CallbackWS()); callbackImpl.publish(sc);
Web サービスのパブリッシュの詳細については、「Web サービスのエンドポイントのパブリッシュ」を参照してください。
TargetService
スタブ実装のインスタンスにアクセスし、インスタンス化したポートを使用して TargetService
の targetOperation
オペレーションを呼び出す。CallbackService
サービスのエンドポイントは、javax.xml.ws.wsaddressing.W3CEndpointReference
データ型として渡します。
@WebServiceRef() private TargetService target; . . . TargetPortType tPort = target.getTargetPort(); String result = tPort.targetOperation(s, callbackImpl.getEndpointReference(W3CEndpointReference.class));
エンドポイントのパブリッシュを停止する。
callbackImpl.stop();
次のサンプルでは、コールバック Web サービスを実装する簡単な JWS ファイルを示します。callback
オペレーションは太字で示されています。
package examples.webservices.callback;
import javax.jws.WebService;
import javax.xml.ws.BindingType;
@WebService(
portName="CallbackPort",
serviceName="CallbackService",
targetNamespace="http://example.oracle.com",
endpointInterface=
"examples.webservices.callback.callbackservice.CallbackPortType",
wsdlLocation="/wsdls/Callback.wsdl")
@BindingType(value="http://schemas.xmlsoap.org/wsdl/soap/http")
public class CallbackWS implements
examples.webservices.callback.callbackservice.CallbackPortType {
public CallbackWS() {
}
public java.lang.String callback(java.lang.String arg0) {
return arg0.toUpperCase();
}
}
build.xml
ファイルを更新して、コールバック Web サービスを呼び出す対象 Web サービスを生成するには、次のサンプルのように taskdefs
および build-target
ターゲットを追加します。詳細については、サンプルの後の説明を参照してください。
<taskdef name="jwsc" classname="weblogic.wsee.tools.anttasks.JwscTask" /> <target name="build-target"> <jwsc srcdir="src" destdir="${ear-dir}" listfiles="true"> <jws file="TargetImpl.java" compiledWsdl="${cowDir}/target/Target_wsdl.jar" type="JAXWS"> <WLHttpTransport contextPath="target" serviceUri="TargetService"/> </jws> <clientgen type="JAXWS" wsdl="Callback.wsdl" packageName="examples.webservices.callback.callbackservice"/> </jwsc> <zip destfile="${ear-dir}/jws.war" update="true"> <zipfileset dir="src/examples/webservices/callback" prefix="wsdls"> <include name="Callback*.wsdl"/> </zipfileset> </zip> </target>
jwsc
Ant タスクの完全なクラス名を定義するには、taskdef
Ant タスクを使用します。クライアント Web サービスをコンパイルする jwsc
Ant タスクを以下のように更新します。
CallbackService
Web サービスの Service
インタフェース スタブを生成およびコンパイルするため、<jws>
要素の <clientgen>
子要素を追加する。jwsc
Ant タスクでは、これらのスタブが生成された WAR ファイルに自動的にパッケージ化されるため、即座にクライアント Web サービスからアクセスできるようになります。このようにするのは、生成されたクラスの 1 つを TartgetImpl
JWS ファイルでインポートして使用するためです。
WAR ファイル内の CallbackService
サービスの WSDL を含めるための <zip>
要素を追加して、他の Web サービスが URL http://${wls.hostname}:${wls.port}/callback/wsdls/Callback.wsdl
から WSDL にアクセスできるようにする。
jwsc
の詳細については、『Oracle Fusion Middleware Oracle WebLogic Server JAX-RPC を使用した Web サービス入門』の「Weblogic Web サービス Ant タスクの実行」を参照してください。