Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS Webサービスの開発 12c (12.2.1.2.0) E82857-02 |
|
前 |
次 |
この章の内容は次のとおりです:
コールバックとは、クライアントとサービスの間の規約の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()
メソッドの実装が、CallbackService
のcallback()
メソッドを明示的に呼び出します。このメソッドは、呼び出されると、CallerService
から渡されたWebサービス・エンドポイントを使用して、コールバック・サービスを実装します。
CallbackService.callback()
メソッドが、TargetService
Webサービスに情報を返送します。
最終的に、TargetService.targetOperation()
メソッドが情報をCallerService
サービスに返送し、コールバック・シーケンスが完了します。
この項の手順では、コールバックを実装するために必要な3つのJWSファイル(ターゲットWebサービス、クライアントWebサービス、コールバックWebサービス)をプログラミングおよびコンパイルする方法について説明します。この手順では、これらのJWSファイルをゼロから作成する方法を示しています。既存のJWSファイルを更新する場合は、この手順をガイドとして利用してください。
Antベースの開発環境を設定済であり、かつjwsc
Antタスクを実行してWebサービスをデプロイするためのターゲットを追加できる、作業用のbuild.xml
ファイルがあることが前提となっています。詳細は、JWSファイルのプログラミングを参照してください。
表26-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サービスを通常どおりデプロイします。 |
「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サービスを通常どおりデプロイします。 |
「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
を使用した実行時情報へのアクセスの詳細は、「Webサービスの実行時情報へのアクセス」を参照してください
CallbackService
実装に渡すWebサービスのエンドポイントを作成し、受信したリクエストを受け入れるためにエンドポイントをパブリッシュします。
Endpoint callbackImpl = Endpoint.create(new CallbackWS()); callbackImpl.publish(sc);
Webサービスのパブリッシュの詳細は、Webサービスのエンドポイントのパブリッシュを参照してください。
TargetService
スタブ実装のインスタンスにアクセスし、インスタンス化したポートを使用してTargetService
のtargetOperation
操作を呼び出します。CallbackService
サービスのエンドポイントは、javax.xml.ws.wsaddressing.W3CEndpointReference
データ型として渡します。
注意:
コールバックが到着する時間範囲内にコールバックWebサービスがデプロイされるようにしてください。
@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 WebLogic Server JAX-RPC Webサービスの開発のjwsc WebLogic WebサービスAntタスクの実行を参照してください。