ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JAX-RPC Webサービスの高度な機能のプログラミング
12cリリース1(12.1.1)
B65947-01
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

7 コールバックによるクライアントへのイベントの通知

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

この章では、以下のトピックについて説明します。

コールバックの概要

コールバックは、なんらかのイベントが発生したことをWebサービスのクライアントに通知するものです。たとえば、クライアントのリクエストの結果が用意されたとき、または、クライアントのリクエストが実行できない場合に、クライアントに通知できます。

メソッドをJWSファイル内で(@WebMethodアノテーションを使用して)標準のパブリック操作として公開した場合は、クライアントがWebサービスにSOAPメッセージを送信して操作を呼び出します。一方、Webサービスにコールバックを追加する場合は、WebサービスからクライアントWebサービスに返送するメッセージを定義して、イベントが発生したことをそのメッセージでクライアントに通知します。つまり、メソッドをパブリック操作として公開することとコールバックを定義することは、送受信の方向が逆になった対照的なプロセスです。

WebLogic Serverでは、呼出し側のクライアントからのSOAPメッセージは、ターゲットWebサービスに自動的にルーティングされます。一方、クライアントがコールバックを受信するためには、クライアントが同じサービスを提供する環境で動作している必要があります。これは一般的に、クライアントがWebサーバー上で動作するWebサービスであることを意味します。クライアントがこれらの要件を満たしていない場合、通常はWebサービスからのコールバックを受信できません。

コールバックに使用されるプロトコルおよびメッセージ形式は、現在の会話を開始したメソッドで使用されているプロトコルおよびメッセージ形式と必ず同じになります。コールバックのプロトコルやメッセージ形式をオーバーライドしようとするとエラーがスローされます。

コールバックの実装の概要と用語

コールバックを実装するには、以下の3つのJavaファイルを作成または更新する必要があります。

次の図に、メッセージの流れを示します。

message_flow.gifの説明が続きます
図message_flow.gifの説明

  1. あるWebLogic Serverインスタンスで動作するCallbackClient WebサービスのclientOperation()メソッドが、TargetServicetargetOperation()操作を明示的に呼び出します。TargetServiceサービスは、別のWebLogic Serverインスタンスで動作していてもかまいません。

  2. TargetService.targetOperation()メソッドの実装が、コールバック・サービスを実装するCallbackInterfacecallbackOperation()操作を明示的に呼び出します。コールバック・サービスは、クライアントWebサービスをホストするWebLogic Serverにデプロイされています。

  3. jwscによって生成されたCallbackInterface.callbackOperation()メソッドの実装は、単純にメッセージをCallbackClient Webサービスに返送します。クライアントWebサービスには、このメッセージを処理するcallbackHandler()メソッドが含まれています。

コールバックのプログラミング: 主な手順

この項の手順では、コールバックを実装するために必要な3つのJWSファイル(ターゲットWebサービス、クライアントWebサービス、コールバック・インタフェース)をプログラミングおよびコンパイルする方法について説明します。この手順では、これらのJWSファイルをゼロから作成する方法を示しています。既存のJWSファイルを更新する場合は、この手順をガイドとして利用してください。

Antベースの開発環境を設定済であり、かつjwsc Antタスクを実行してWebサービスをデプロイするためのターゲットを追加できる、作業用のbuild.xmlファイルがあることが前提となっています。詳細は、『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』を参照してください。

表7-1 コールバックのプログラミング手順

#
手順 説明

1

ターゲットWebサービスを実装する、新しいJWSファイルを作成するか、既存のJWSファイルを更新します。

使い慣れたIDEまたはテキスト・エディタを使用します。「ターゲットWebサービスのプログラミングのガイドライン」を参照してください。

注意: ターゲットWebサービスを実装するJWSファイルは、コールバック・インタフェースの1つ以上のコールバック・メソッドを呼び出します。(コールバック・インタフェースのプログラミング手順については後述の説明を参照してください。)したがって、この手順に従って順番にプログラミングするのではなく、3つのJWSファイルを同時にプログラミングすることをお薦めします。ここでは、各手順を理解しやすくするため、この順番で説明しています。

2

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

『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のjwsc WebLogic WebサービスAntタスクの実行に関する項を参照してください。

3

Antターゲットを実行して、ターゲットWebサービスをビルドします。

例:

prompt> ant build-mainService

4

ターゲットWebサービスを通常どおりデプロイします。

『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のWebLogic Webサービスのデプロイとアンデプロイに関する項を参照してください。

5

クライアントWebサービスを実装する、新しいJWSファイルを作成するか、既存のJWSファイルを更新します。

クライアントWebサービスは、ターゲットWebサービスをホストするものとは別のWebLogic Serverインスタンスにデプロイされていることが前提となっています。「コールバック・クライアントWebサービスのプログラミングのガイドライン」を参照してください。

6

コールバックWebサービスを実装するコールバックJWSインタフェースを作成します。

「コールバック・インタフェースのプログラミングのガイドライン」を参照してください。

7

クライアントWebサービスをビルドするbuild.xmlファイルを更新します。

クライアントWebサービスをビルドするjwsc Antタスクでは、コールバックWebサービスもコールバック・インタフェース・ファイルから暗黙的に生成されます。「クライアントWebサービスのbuild.xmlファイルの更新」を参照してください。

8

Antターゲットを実行して、クライアントおよびコールバックWebサービスをビルドします。

例:

prompt> ant build-clientService

9

クライアントWebサービスを通常どおりデプロイします。

『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のWebLogic Webサービスのデプロイとアンデプロイに関する項を参照してください。


ターゲットWebサービスのプログラミングのガイドライン

次のサンプルでは、ターゲットWebサービスを実装する簡単なJWSファイルを示します。太字で示されたJavaコードに対応するコーディングのガイドラインについては、サンプルの後の説明を参照してください。

package examples.webservices.callback;

import weblogic.jws.WLHttpTransport;
import weblogic.jws.Callback; 

import javax.jws.WebService;
import javax.jws.WebMethod;

@WebService(name="CallbackPortType",
            serviceName="TargetService",
            targetNamespace="http://examples.org/")

@WLHttpTransport(contextPath="callback",
                 serviceUri="TargetService",
                 portName="TargetServicePort")

/**
 * callback service
 */

public class TargetServiceImpl {

  @Callback 
  CallbackInterface callback; 

  @WebMethod
  public void targetOperation (String message) {

        callback.callbackOperation (message); 
  }

}

ターゲットWebサービスを実装するJWSファイルをプログラミングする際には、次のガイドラインに従います。ガイドラインのコード・スニペットは、前述のサンプルでは太字で示されています。

この項で説明したWebLogic固有のJWSアノテーションの詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のJWSアノテーション・リファレンスの項を参照してください。

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

次のサンプルでは、「ターゲットWebサービスのプログラミングのガイドライン」で説明したターゲットWebサービスを呼び出すクライアントWebサービス用の簡単なJWSファイルを示します。太字で示されたJavaコードに対応するコーディングのガイドラインについては、サンプルの後の説明を参照してください。

package examples.webservices.callback;

import weblogic.jws.WLHttpTransport;
import weblogic.jws.ServiceClient; 
import weblogic.jws.CallbackMethod; 
import weblogic.jws.security.CallbackRolesAllowed; 
import weblogic.jws.security.SecurityRole; 

import javax.jws.WebService;
import javax.jws.WebMethod;

import examples.webservices.callback.CallbackPortType; 

import java.rmi.RemoteException;

@WebService(name="CallbackClientPortType",
            serviceName="CallbackClientService",
            targetNamespace="http://examples.org/")

@WLHttpTransport(contextPath="callbackClient",
                 serviceUri="CallbackClient",
                 portName="CallbackClientPort")

public class CallbackClientImpl {

  @ServiceClient( 
     wsdlLocation="http://localhost:7001/callback/TargetService?WSDL", 
     serviceName="TargetService", 
     portName="TargetServicePort") 
  @CallbackRolesAllowed(@SecurityRole(role="mgr", mapToPrincipals="joe")) 
  private CallbackPortType port; 

  @WebMethod
  public void clientOperation (String message) {

    try {

        port.targetOperation(message); 
    }
    catch (RemoteException e) {
      e.printStackTrace();
    }

  }
  @CallbackMethod(target="port", operation="callbackOperation") 
  @CallbackRolesAllowed(@SecurityRole(role="engineer",  mapToPrincipals="shackell")) 
  public void callbackHandler(String msg) { 

        System.out.println (msg); 
  } 

}

ターゲットWebサービスを呼び出すJWSファイルをプログラミングする際には、次のガイドラインに従います。ガイドラインのコード・スニペットは、前述のサンプルでは太字で示されています。

この項で説明したWebLogic固有のJWSアノテーションの詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のJWSアノテーション・リファレンスの項を参照してください。

コールバック・インタフェースのプログラミングのガイドライン

コールバック・インタフェースも、Webサービスを実装したJWSファイルです。ただし、大きな違いが1つあります。コールバック・インタフェースでは、標準の@javax.jws.WebServiceアノテーションを使用して標準のWebサービスであることを指定するかわりに、WebLogic固有の@weblogic.jws.CallbackServiceを使用してコールバック・サービスであることを指定します。@CallbackServiceの属性は、@WebServiceの属性の限定的なサブセットです。

コールバック・サービスを実装するJWSファイルをプログラミングする場合は、使用できるデータ型およびJWSアノテーションについて以下の制約があります。

次の例では、コールバックWebサービスを実装する簡単なコールバック・インタフェース・ファイルを示します。まず、「ターゲットWebサービスのプログラミングのガイドライン」で説明したターゲットWebサービスが、このインタフェースのメソッドを明示的に呼び出します。次に、jwscによって生成されたコールバック・インタフェースの実装が、ターゲットWebサービスの呼出し元のクライアントWebサービスにメッセージを自動的に返送します。クライアントWebサービスについては「コールバック・クライアントWebサービスのプログラミングのガイドライン」を参照してください。太字で示されたJavaコードに対応するコーディングのガイドラインについては、サンプルの後の説明を参照してください。

package examples.webservices.callback;

import weblogic.jws.CallbackService; 

import javax.jws.Oneway;
import javax.jws.WebMethod;

@CallbackService 
public interface CallbackInterface { 

  @WebMethod
  @Oneway 
  public void callbackOperation (String msg); 

}

コールバックWebサービスを実装するJWSファイルをプログラミングする際には、次のガイドラインに従います。ガイドラインのコード・スニペットは、前述のサンプルでは太字で示されています。

この項で説明したWebLogic固有のJWSアノテーションの詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のJWSアノテーション・リファレンスの項を参照してください。

クライアントWebサービスのbuild.xmlファイルの更新

クライアントWebサービスを実装するJWSファイルに対してjwsc Antタスクを実行すると、この項で説明するように、コールバックWebサービスも暗黙的に生成されます。

build.xmlファイルを更新して、ターゲットWebサービスを呼び出すクライアントWebサービスを生成するには、次のサンプルのようなtaskdefsおよびbuild-clientServiceターゲットを追加します。詳細は、サンプルの後の説明を参照してください。

<taskdef name="jwsc"
  classname="weblogic.wsee.tools.anttasks.JwscTask" />

<target name="build-clientService">

  <jwsc
      srcdir="src"
      destdir="${clientService-ear-dir}" >

      <jws file="examples/webservices/callback/CallbackClientImpl.java" >

        <clientgen
          wsdl="http://${wls.hostname}:${wls.port}/callback/TargetService?WSDL"
          packageName="examples.webservices.callback"
          serviceName="TargetService" />

      </jws>

  </jwsc>

</target>

jwsc Antタスクの完全なクラス名を定義するには、taskdef Antタスクを使用します。

クライアントWebサービスをコンパイルするjwsc Antタスクを更新して、<jws>要素の<clientgen>子要素を含めます。これにより、デプロイされたTargetService WebサービスのJAX-RPCスタブが生成およびコンパイルされるようになります。jwsc Antタスクでは、これらのスタブが生成されたWARファイルに自動的にパッケージ化されるため、即座にクライアントWebサービスからアクセスできるようになります。このようにするのは、生成されたクラスの1つをCallbackClientImpl JWSファイルでインポートして使用するためです。

ターゲットWebサービスのWSDLには、ターゲットWebサービスから呼び出されるコールバックWebサービスを表す追加の<service>要素が含まれています。このため、jwsc Antタスクの<clientgen>子要素によってコールバックWebサービスも生成およびコンパイルされ、クライアントWebサービスと同じEARファイルにパッケージ化されます。