プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS Webサービスの開発
12c (12.2.1.2.0)
E82857-02
目次へ移動
目次

前
次

26 コールバックの使用

この章では、Java API for XML Web Services (JAX-WS)を使用したWebLogic Webサービスで、コールバックを使用してクライアントにイベントを通知する方法について説明します。

この章の内容は次のとおりです:

コールバックの概要

コールバックとは、クライアントとサービスの間の規約の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を標準の方法で呼び出すメソッドです。

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

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

図26-1の説明が続きます
「図26-1 コールバック実装のサンプル」の説明
  1. あるWebLogic Serverインスタンスで実行されているCallerService Webサービスのcall()メソッドが、TargetServicetargetOperation()メソッドを明示的に呼び出し、CallbackServiceにWebサービスのエンドポイントを渡します。通常、TargetServiceサービスは、別のWebLogic Serverインスタンスで実行されています。

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

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

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

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

「ターゲット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サービスをビルドする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サービスを通常どおりデプロイします。

「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ファイルをプログラミングする際には、次のガイドラインに従います。ガイドラインのコード・スニペットは、前述のサンプルでは太字で示されています。

  • コールバック・サービスのエンドポイントを渡すために必要なパッケージをインポートし、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サービスを呼び出すクライアント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スタブ実装のインスタンスにアクセスし、インスタンス化したポートを使用してTargetServicetargetOperation操作を呼び出します。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サービスのプログラミングのガイドライン

次のサンプルでは、コールバック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タスクを次のように更新します。

  • デプロイ済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タスクの実行を参照してください。