ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS を使用した Web サービスの高度な機能のプログラミング
11g リリース 1 (10.3.1)
B55543-01
  目次
目次

戻る
戻る
 
次へ
次へ
 

4 コールバックの使用

以下の節では、コールバックを使用してクライアントにイベントを通知する方法について説明します。

コールバックの概要

コールバックとは、クライアントとサービスの間の規約の 1 つです。サービスはコールバックを使用することで、クライアントに追加のデータを照会することを目的として、サービス メソッドの呼び出しの間にクライアント提供のエンドポイントでオペレーションを呼び出すことができます。これにより、クライアントが動作を注入したり、クライアントに進行状況を通知したりすることが可能になります。サービスは、コールバックのポート タイプを定義する WSDL を使用してコールバックの要件を公開します。一方クライアントは、WS-Addressing を使用して、コールバック エンドポイントのアドレスをサービスに通知します。

コールバック実装のサンプル

この節で説明するコールバック実装のサンプルは、以下の 3 つの Java ファイルから構成されています。

次の図に、コールバック実装のサンプルでのメッセージの流れを示します。

図 4-1 コールバック実装のサンプル

周囲のテキストは図 4-1 を説明します。
  1. ある WebLogic Server インスタンスで実行されている CallerService Web サービスの call() メソッドが、TargetServicetargetOperation() メソッドを明示的に呼び出し、CallbackService に Web サービスのエンドポイントを渡します。通常、TargetService サービスは、別の WebLogic Server インスタンスで実行されています。

  2. TargetService.targetOperation() メソッドの実装が、メソッドの呼び出し時に CallerService から渡された Web サービス コールバックを使用して、コールバック サービスを実装する CallbackServicecallback() メソッドを明示的に呼び出します。

  3. CallbackService.callback() メソッドが、TargetService Web サービスに情報を返送します。

  4. 最終的に、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

build.xml ファイルを更新して、対象の JWS ファイルを Web サービスにコンパイルするための jwsc Ant タスクの呼び出しを含める。

対象 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 サービスをビルドする build.xml ファイルを更新する。

クライアント Web サービスをビルドする jwsc Ant タスクでは、CallbackWS.java もコンパイルされます。また、そのクラス ファイルは、Fileset Ant タスク要素によって WAR ファイルに格納されます。コード リスト :

<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 サービスのプログラミングのガイドライン

次のサンプルでは、対象 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 ファイルをプログラミングする際には、以下のガイドラインに従います。ガイドラインのサンプル コードは、上述のサンプルでは太字で示されています。

コールバック クライアント Web サービスのプログラミングのガイドライン

次のサンプルでは、「対象 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 サービスのプログラミングのガイドライン

次のサンプルでは、コールバック 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(); 
     }
}

対象 Web サービスの build.xml ファイルの更新

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 タスクを以下のように更新します。

jwsc の詳細については、『Oracle Fusion Middleware Oracle WebLogic Server JAX-RPC を使用した Web サービス入門』の「Weblogic Web サービス Ant タスクの実行」を参照してください。