![]() ![]() ![]() ![]() |
以下の節では、コールバックを使用してクライアントにイベントを通知する方法について説明します。
コールバックとは、クライアントとサービスの間の規約の 1 つです。サービスはコールバックを使用することで、クライアントに追加のデータを照会することを目的として、サービス メソッドの呼び出しの間にクライアント提供のエンドポイントでオペレーションを呼び出すことができます。これにより、クライアントが動作を注入したり、クライアントに進行状況を通知したりすることが可能になります。サービスは、コールバックのポート タイプを定義する WSDL を使用してコールバックの要件を公開します。一方クライアントは、WS-Addressing を使用して、コールバック エンドポイントのアドレスをサービスに通知します。
この節で説明するコールバック実装のサンプルは、以下の 3 つの Java ファイルから構成されています。
この節で示すサンプルでは、コールバック Web サービスの名前を CallbackService
としています。この Web サービスには、単一のコールバック メソッド、callback()
が定義されています。
このサンプルでは、この Web サービスの名前が TargetService
になっており、単一の標準メソッド targetOperation()
が定義されています。
サンプルでは、この Web サービスの名前を CallerService
としています。call()
は、TargetService
を標準の方法で呼び出すメソッドです。
次の図に、コールバック実装のサンプルでのメッセージの流れを示します。
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
ファイルがあることが前提となっています。詳細については、『JAX-WS を使用した WebLogic Web サービスの開始』を参照してください。
|
||||
prompt> ant build-target |
||||
prompt> ant build-caller |
||||
次のサンプルでは、対象 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.bea.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.xml.ws.Endpoint;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.BindingType;
import javax.xml.ws.WebServiceContext;import javax.xml.ws.WebServiceException;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.WebServiceRef;
import javax.xml.ws.wsaddressing.W3CEndpointReference;import examples.webservices.callback.target.*;
@WebService(
portName="CallerPort",
serviceName="CallerService",
targetNamespace="http://example.bea.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 ファイルをプログラミングする際には、以下のガイドラインに従います。ガイドラインのサンプル コードは、上述のサンプル内では太字で示されています。
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
Object sc
private WebServiceContext context;
.
.
.
context.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
WebServiceContext
および MessageContext
を使用した実行時情報へのアクセスの詳細については、『JAX-WS を使用した WebLogic 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.bea.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 ファイルでインポートして使用するためです。CallbackService
サービスの WSDL を含めるための <zip>
要素を追加して、他の Web サービスが URL http://${wls.hostname}:${wls.port}/callback/wsdls/Callback.wsdl
から WSDL にアクセスできるようにする。
jwsc
の詳細については、『JAX-RPC を使用した WebLogic Web サービスの開始』の「jwsc WebLogic Web サービス Ant タスクの実行」を参照してください。
![]() ![]() ![]() |