ナビゲーションをスキップ

WebLogic Web サービス プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

信頼性のある SOAP メッセージングの使い方

以下の節では、WebLogic Server インスタンス間で、SOAP メッセージの送信側および受信側として信頼性のある SOAP メッセージングを使用する方法について説明します。

警告 :信頼性のある SOAP メッセージングは、クラスタ化環境ではサポートされません。

 


信頼性のある SOAP メッセージングの概要

信頼性のある SOAP メッセージングというフレームワークでは、ある WebLogic Server インスタンスで稼動しているアプリケーションによって、別の WebLogic Server インスタンスで稼動している Web サービスを、非同期かつ確実に呼び出せます。信頼性のある、とは 2 つの Web サービス間でのメッセージの配信を保証できるということです。

注意 :信頼性のある SOAP メッセージングは、1 つの WebLogic Server インスタンスにデプロイされた 2 つの Web サービス間で機能します。通常、この設定は開発のために使用されます。しかし、実際には、信頼性のある SOAP メッセージングは 2 つの WebLogic Server インスタンス間で使用され、これらの 2 つのインスタンスは、信頼性のある SOAP メッセージングを使用するようにコンフィグレーションする必要があります。

送信側の WebLogic Server は、受信側の WebLogic Server で実行している信頼性のある Web サービス オペレーションを非同期に呼び出すアプリケーションを備えています。送信側は、信頼性のある SOAP メッセージングの情報をヘッダに含む SOAP メッセージを受信側に送信します。呼び出される Web サービス オペレーションは、信頼性のある SOAP メッセージング用にコンフィグレーションされています。呼び出しは非同期に行われるため、送信側は、該当するオペレーションが呼び出されたかどうかを直ちに確認できません。ただし、次の 2 つの通知のいずれかを受信することになります。

WebLogic Web サービス非同期 API を使用すると、送信側は受信側にポーリングして通知を確認するか、または通知するコールバックを登録できます。その結果、送信側は、メッセージが受信されたことを伝える通知を受け取るか、またはメッセージが配信されなかったことを伝える通知を受け取ります。

信頼性のある SOAP メッセージングは、転送方法に依存しません。デフォルトでは HTTP/S が使用されますが、受信する Web サービスを適切にコンフィグレーションして送信側が Web サービスを呼び出すときに JMS ポートを利用するようにすれば、JMS を使用することもできます。JMS 転送の使い方の詳細については、「JMS 転送を使用した WebLogic Web サービスの呼び出し」を参照してください。

信頼性のある SOAP メッセージングのアーキテクチャ

この節では、以下の用語が使用されています。

次の図と手順では、信頼性のある SOAP メッセージング機能のアーキテクチャについて説明します。

図 10-1 WebLogic SOAP メッセージング アーキテクチャ

信頼性のある SOAP メッセージングのアーキテクチャ


 
  1. 送信側アプリケーションは、受信側 WebLogic Server で実行している信頼性のあるオペレーションを呼び出します。
  2. 送信側ランタイムの永続 JMS ストアにメッセージが保存されます。永続 JMS ストアには、JMS ファイルまたは JDBC ストアを使用できます。
  3. 送信側ランタイムは、SOAP メッセージを受信側 WebLogic Server に送信します。

  4. 受信側ランタイムはメッセージを受信して永続 JMS ストアに重複するメッセージがないかどうかをチェックし、重複がない場合はメッセージ ID をストアに保存します。重複がある場合、受信側ランタイムはメッセージを確認応答しますが、受信側 Web サービスにはメッセージを配信しません。
  5. 注意 :メッセージ全体ではなく、メッセージ ID だけが受信側のストアに永続的に保存されます。

    受信側が実行するアクションは、トランザクションのコンテキスト内で行われます。「受信側のトランザクションのコンテキスト」を参照してください。

  6. 受信側ランタイムは信頼性のあるオペレーションを呼び出し、SOAP ヘッダで指定されている送信側に確認応答を返送します。
  7. 確実に呼び出せるのは void オペレーションだけなので、受信側は送信側に値を返しません。呼び出したオペレーションでアプリケーション例外が送出されると、その例外も送信側に返送されます。Java クラスではなく EJB によるシステム例外では、受信側が開始したトランザクションがロールバックされます。詳細については、「受信側のトランザクションのコンテキスト」を参照してください。

  8. 送信側ランタイムは、メッセージが再度送信されないように永続ストアからメッセージを削除します。
  9. 送信側は、受信通知を受け取らない場合はメッセージ送信を再試行するようにコンフィグレーションされます。送信側での再試行の回数と間隔を Administration Console でコンフィグレーションします。送信側ランタイムが再試行の最大回数までメッセージを再送信すると、そのメッセージはストアから削除されます。

  10. 送信側ランタイムは、コールバックまたはポーリングによって送信側アプリケーションに通知を送信し、メッセージが受信されてオペレーションが呼び出されたことを伝えるか、またはメッセージが正しく配信されなかったことを伝えます。

受信側のトランザクションのコンテキスト

受信側ランタイムが送信側からのメッセージを受け取ると、トランザクションが開始され、受信側の以降のすべてのアクションはこのトランザクションのコンテキスト内ですべて実行されます。

  1. 送信側からメッセージを受け取ります。
  2. トランザクションを開始します。
  3. 永続ストアで重複の有無をチェックします。
  4. 重複がある場合、受信側は確認応答を送信側に返送してトランザクションをロールバックします。
  5. 重複がない場合は、メッセージ ID をストアに保存します。
  6. オペレーションを呼び出します。
  7. 確認応答を送信側に返送します。
  8. トランザクションをコミットします。

受信側のすべてのアクションをトランザクションのコンテキスト内で実行する主な理由は、永続ストアでのメッセージ ID の整合性を維持することにあります。たとえば、受信側がメッセージ ID をストアに保存した直後に WebLogic Server がクラッシュし、受信側がまだオペレーションを呼び出していない場合は、トランザクションがロールバックされ、保存したメッセージ ID はストアから削除されます。後で送信側がメッセージを再送信すると (オペレーションの呼び出しの応答確認を送信側がまだ受信していないため)、受信側にはメッセージの履歴がなく、全プロセスが正しく再実行されます。受信側がトランザクションのコンテキスト内で実行されなかった場合は、不適切なメッセージ ID がストア内に存在するため、オペレーションは呼び出されません。

トランザクション中に以下のいずれかのイベントが発生すると、受信側が開始したトランザクションはロールバックされます。

次のイベントでは、トランザクションのロールバックが行われません。

http:信頼性のある Web サービス オペレーションを実装する EJB のプログラミングのガイドライン

ステートレス セッション EJB で実装された、オペレーションの確実な呼び出しが可能な Web サービスを作成するには、EJB のプログラミング時に以下のガイドラインに従います。

詳細については、『WebLogic エンタープライズ JavaBeans プログラマーズ ガイド』と『WebLogic JTA プログラマーズ ガイド』を参照してください。

信頼性のある Web サービス オペレーションを実装する Java クラスのプログラミングのガイドライン

Java クラスで実装された、オペレーションの確実な呼び出しが可能な Web サービスを作成するには、Java クラスのプログラミング時に以下のガイドラインに従います。

詳細については、『WebLogic JTA プログラマーズ ガイド』を参照してください。

トランザクションをコンフィグレーションする

Administration Console を使用して、次のトランザクション属性をコンフィグレーションします。

JTA トランザクションのコンフィグレーション設定は、ドメイン レベルで適用できます。つまり、コンフィグレーション属性の設定はドメイン内のすべてのサーバに適用されることになります。 詳細については、「トランザクションのコンフィグレーション」を参照してください。

信頼性のある SOAP メッセージングの制限

 


信頼性のある SOAP メッセージングの使い方 : 主な手順

ここでは、信頼性のある SOAP メッセージングをコンフィグレーションして WebLogic Web サービス オペレーションを呼び出すための主な手順を示します。この手順では、送信側と受信側の WebLogic Server インスタンスで行われるコンフィグレーションとコード記述のタスクについて説明します。

注意 :この手順では、ユーザが WebLogic Web サービスをすでに実装およびアセンブルしていて、かつ 1 つまたは複数の Web サービス オペレーションの確実な呼び出しを可能にするのが目的であることを前提としています。さらに、信頼性のない方法で Web サービスを呼び出すサーバサイド アプリケーション (Web アプリケーションのサーブレットなど) をすでにコーディングしており、このアプリケーションを更新して Web サービスを確実に呼び出すのが目的であることを前提としています。

これらのタスクの詳細については、「WebLogic Web サービスの実装」、「Ant タスクを使用した WebLogic Web サービスのアセンブル」、および「クライアント アプリケーションおよび WebLogic Server からの Web サービスの呼び出し」を参照してください。

  1. 送信側の WebLogic Server インスタンスに対して、信頼性のある SOAP メッセージングの属性をコンフィグレーションします。
  2. 送信側 WebLogic Server をコンフィグレーションする」を参照してください。

  3. 受信側の WebLogic Server インスタンスに対して、信頼性のある SOAP メッセージングの属性をコンフィグレーションします。
  4. 受信側 WebLogic Server をコンフィグレーションする」を参照してください。

  5. 次の例に示すように、servicegen Ant タスクの呼び出しを含む build.xml ファイルを更新し、受信側の WebLogic Server で Web サービスをビルドする <service> 要素に <reliability> 子要素を追加します。
      <servicegen
destEar="ears/myWebService.ear"
warName="myWAR.war"
contextURI="web_services" >
<service
ejbJar="jars/myEJB.jar"
targetNamespace="http://www.bea.com/examples/Trader"
serviceName="TraderService"
serviceURI="/TraderService"
generateTypes="True"
expandMethods="True" >
<reliability duplicateElimination="True"
persistDuration="60"
/>
</service>
</servicegen>

この例では、Web サービスは同じ送信側アプリケーションによる重複呼び出しを無視し、少なくとも 60 秒間メッセージを保持します。<reliability> 要素の属性の詳細については、「servicegen」を参照してください。

注意 :この build.xml ファイルを使用して Web サービスを再生成すると、void を返すすべてのオペレーションで信頼性のある呼び出しが有効化されます。あるオペレーションのみを確実に呼び出す場合や、servicegen で Web サービスを再生成しない場合は、WebLogic Web サービスの web-services.xml ファイルを手動で更新できます。詳細については、「信頼性のある SOAP メッセージングの web-services.xml ファイルを手動で更新する」を参照してください。

  1. servicegen Ant タスクを再実行して、受信側 Web サービスを再生成します。
  2. generateAsyncMethods="True" 属性を指定して clientgen Ant タスクを再実行し、非同期オペレーションの呼び出しを含む、Web サービス固有のクライアント JAR ファイルを新規に生成します。この新しいクライアント JAR ファイルは、送信側 WebLogic Server で実行しているサーバサイド アプリケーションで使用されます。
  3. 送信側 WebLogic Server で実行しているクライアント アプリケーションで、Web サービスを呼び出す Java コードを更新して Web サービスを確実に呼び出せるようにします。
  4. 例については、「確実にオペレーションを呼び出す Java コードを記述する」を参照してください。

送信側 WebLogic Server をコンフィグレーションする

この節では、送信側 WebLogic Server インスタンスの信頼性のある SOAP メッセージングの属性をコンフィグレーションする方法について説明します。

注意 :信頼性のある SOAP メッセージングのコンフィグレーションには、JMS ファイルまたは JDBC ストアのコンフィグレーションを伴います (JMS ファイルまたは JDBC ストアが存在していない場合)。

次の表では、信頼性のある SOAP メッセージングの属性について説明します。

表 10-1 送信側 WebLogic Server の信頼性のある SOAP メッセージングの属性

属性

説明

ストア

送信される信頼性のある SOAP メッセージを保持するために送信側 WebLogic Server によって使用される永続 JMS ストア。

デフォルト再試行回数

送信側ランタイムが、受信側 WebLogic Server でまだ確認応答されていないメッセージの再配信を試みるデフォルトの最大回数。

デフォルト値は 10。

デフォルト再試行間隔

受信側がメッセージの受信を確認応答していない場合、または送信側ランタイムがメッセージを送信しようとしているときに通信エラーを検出した場合に、送信側ランタイムが再試行を待機する間隔のデフォルトの最小秒数。

デフォルト値は 600。

これらの属性をコンフィグレーションするには、次の手順に従います。

  1. WebLogic Web サービスの管理の概要」に従って、ブラウザで Administration Console を起動します。
  2. JMS ストアを作成します (存在していない場合)。JMS ストアには、JMS ファイル ストアまたは JMS JDBC ストアを使用できます。「JMS ファイル ストアのタスク」および「JMS JDBC ストアのタスク」を参照してください。
  3. 警告 :JMS ストアは移行できません。

  4. 左ペインの [サーバ] ノードをクリックします。
  5. 信頼性のある SOAP メッセージングを送信側としてのロールでコンフィグレーションする WebLogic Server を選択します。
  6. 右ペインで、[サービス|Web サービス] タブを選択します。
  7. 送信側として機能するときに WebLogic Server の信頼性のある SOAP メッセージが保存される JMS ストアを [ストア] ドロップダウン リストから選択します。
  8. 送信側 WebLogic Server がメッセージの再送信を試行するデフォルトの最大回数を [デフォルト再試行回数] フィールドに入力します。
  9. 送信側 WebLogic Server が再試行を待機する間隔のデフォルトの最小秒数を [デフォルト再試行間隔] フィールドに入力します。
  10. 信頼性のある SOAP メッセージの受信側がメッセージの履歴を JMS ストアに保持するデフォルトの最小秒数を [デフォルト生存時間] フィールドに入力します。
  11. 警告 :この値は、確実に呼び出される Web サービス オペレーションの対応する値よりも大きくなければなりません。以降の節では、呼び出した <operation><reliable-delivery> 下位要素の persist-duration 属性を更新して、Web サービスの web-services.xml ファイルでこの値をコンフィグレーションする方法について説明します。

  12. [適用] をクリックします。

受信側 WebLogic Server をコンフィグレーションする

この節では、受信側 WebLogic Server インスタンスの信頼性のある SOAP メッセージングの属性をコンフィグレーションする方法について説明します。

注意 :信頼性のある SOAP メッセージングのコンフィグレーションには、JMS ファイルまたは JDBC ストアのコンフィグレーションを伴います (JMS ファイルまたは JDBC ストアが存在していない場合)。

次の表では、信頼性のある SOAP メッセージングの属性について説明します。

表 10-2 受信側 WebLogic Server の信頼性のある SOAP メッセージングの属性

属性

説明

ストア

送信側から送信された信頼性のある SOAP メッセージの履歴を保持するために、受信側 WebLogic Server によって使用される永続 JMS ストア。

デフォルト生存時間

信頼性のある SOAP メッセージの受信側が、メッセージの履歴をストアに保持する秒数のデフォルト値。

最初のメッセージ送信後にデフォルト生存時間の秒数が経過すると、送信側はそのメッセージ ID を持つメッセージの再送信を停止する。

デフォルト生存時間の秒数が経過する前に送信側でメッセージを正常に送信できない場合は、送信側で配信障害がレポートされる。

これらの属性をコンフィグレーションするには、次の手順に従います。

  1. WebLogic Web サービスの管理の概要」に従って、ブラウザで Administration Console を起動します。
  2. JMS ストアを作成します (存在していない場合)。JMS ストアには、JMS ファイル ストアまたは JMS JDBC ストアを使用できます。「JMS ファイル ストアのタスク」および「JMS JDBC ストアのタスク」を参照してください。
  3. 警告 :JMS ストアは移行できません。

  4. 左ペインの [サーバ] ノードをクリックします。
  5. 信頼性のある SOAP メッセージングを受信側としてのロールでコンフィグレーションする WebLogic Server を選択します。
  6. 右ペインで、[サービス|Web サービス] タブを選択します。
  7. 受信側による重複除去に使用する JMS ストアを [ストア] ドロップダウン リストから選択します。
  8. [デフォルト生存時間] フィールドに秒数を入力します。
  9. このマニュアルの以降の節では、各 Web サービス オペレーションでこのデフォルト値をオーバーライドする方法について説明します。「信頼性のある SOAP メッセージングの web-services.xml ファイルを手動で更新する」を参照してください。

  10. [適用] をクリックします。

確実にオペレーションを呼び出す Java コードを記述する

web-services.xml ファイルで WebLogic Web サービス オペレーションの定義を更新し、対応する <operation> 要素に <reliable-deliver> 子要素を追加して、WebLogic Web サービス オペレーションに信頼性があることを指定します。この操作を行うには、servicegen Ant タスクを使用するか (「信頼性のある SOAP メッセージングの使い方 : 主な手順」を参照)、または web-services.xml ファイルを手動で更新します (「信頼性のある SOAP メッセージングの web-services.xml ファイルを手動で更新する」を参照)。ただし、信頼性のあるオペレーションを信頼性のある状態で呼び出すときにクライアント アプリケーションは不要です。以下の 3 つの方法で信頼性のあるオペレーションを呼び出すことができます。

送信側アプリケーションから Web サービス オペレーションを確実に呼び出す Java コードの記述は、オペレーションを非同期に呼び出す場合 (「非同期クライアント アプリケーションの記述」を参照) とよく似ています。オペレーションの非同期での呼び出しは、startOperation()endOperation() の 2 つのメソッドに分かれています。

確実にオペレーションを呼び出すには、標準の非同期クライアント Java コード以外に以下の作業が必要になります。

次の例は、processOrder() オペレーションを非同期で確実に呼び出す最も簡単な方法を示しています。この方法では、setReliableDeliver(true) メソッドを指定し、非同期 API を使用してオペレーションを startProcessOrder()endProcessOrder() の 2 つの呼び出しに分割します。generateAsyncMethods 属性を指定することにより、これらの 2 つのメソッドをスタブで生成することを clientgen Ant タスクに指示します。

import weblogic.utils.Debug;
import weblogic.webservice.async.AsyncInfo;
import weblogic.webservice.async.FutureResult;
public final class ReliableSender {
public void placeOrder(String order) {
try {
// Web サービスのポートを設定する
MarketService market = new MarketService_Impl();
MarketServicePort marketPort = marketService.getMarketServicePort();
      // 信頼性のある配信を可能にする
AsyncInfo asyncCtx = new AsyncInfo();
asyncCtx.setReliableDelivery(true);
      // Web サービスを非同期に呼び出す
FutureResult futureResult = marketPort.startProcessOrder(order, asyncCtx);
marketPort.endProcessOrder(futureResult);
    } catch (Exception e) {
Debug.say("Exception in ReliableSender: " + e);
}
}
}

前回の例に基づく、より複雑な例を次に示します。この例では結果のリスナを設定し、非同期で信頼性のあるオペレーションの呼び出し完了をリスンします。onCompletion() メソッドの実装では、呼び出し完了時の動作が指定されます。この例では、呼び出しに失敗するとメッセージが出力されます。

import java.io.Serializable;
import weblogic.webservice.async.AsyncInfo;
import weblogic.webservice.async.FutureResult;
import weblogic.webservice.async.InvokeCompletedEvent;
import weblogic.webservice.async.ResultListener;
import weblogic.webservice.async.ReliableDeliveryFailureEvent;
import weblogic.utils.Debug;
public final class ReliableSender {
  public void placeOrder(String order) {
try {
// Web サービスのポートを設定する
MarketService market = new MarketService_Impl();
MarketServicePort marketPort = marketService.getMarketServicePort();
      // 信頼性のある配信を可能にする
AsyncInfo asyncCtx = new AsyncInfo();
asyncCtx.setReliableDelivery(true);
      // 結果のリスナを設定する
RMListener listener = new RMListener();
asyncCtx.setResultListener(listener);
      // Web サービスを非同期に呼び出す
FutureResult futureResult = marketPort.startProcessOrder(order, asyncCtx);
      while ( !futureResult.isCompleted()) {
Debug.say("async polling ..."); // 何か他の処理をする
Thread.sleep(3000);
}
      marketPort.endProcessOrder(futureResult);
    } catch (Exception e) {
Debug.say("Exception in ReliableSender: " + e);
}
}
}
class RMListener implements ResultListener, Serializable {
  public void onCompletion(InvokeCompletedEvent event) {
if (event instanceof ReliableDeliveryFailureEvent) {
ReliableDeliveryFailureEvent rdEvent =
(ReliableDeliveryFailureEvent) event;
Debug.say("Reliable delivery failed with the following message: " +
rdEvent.getErrorMessage());
}
}
}

送信側のサーバ障害を処理する

オペレーションを確実に呼び出すアプリケーションは、SOAP メッセージ配信の再試行中に送信側サーバがクラッシュしても対応できる必要があります。送信側サーバが再起動すると、正しく配信されていないメッセージの有無が永続ストアでチェックされ、メッセージがある場合は受信側サーバへのメッセージ送信が引き続き試行されます。一方、送信側サーバのクラッシュのために、最初にオペレーションを確実に呼び出したアプリケーションはデプロイされなくなり、送信側サーバの再起動後に受信側サーバが確認応答を返送しても、この確認応答を受け付けるアプリケーションが存在しないという問題が生じます。

こうした状況に正しく対処するには、次のガイドラインに従ってアプリケーションをコーディングします。

信頼性のある SOAP メッセージングの web-services.xml ファイルを手動で更新する

servicegen Ant タスクを使用して Web サービスを再生成すると、void を返すすべてのオペレーションで信頼性のある呼び出しが可能になります。この節で説明するように、あるオペレーションのみを確実に呼び出す場合や、servicegen で Web サービスを再生成しない場合は、WebLogic Web サービスの web-services.xml ファイルを手動で更新できます。

web-services.xml ファイルは、Web サービス EAR ファイルにある Web アプリケーションの WEB-INF ディレクトリにあります。ファイルの場所の詳細については、「Web サービス EAR ファイル パッケージ」を参照してください。

web-services.xml ファイルを更新して 1 つまたは複数のオペレーションに対して信頼性のある SOAP メッセージングを有効化するには、以下の手順に従います。

  1. 任意のエディタで、web-services.xml ファイルを開きます。
  2. 信頼性のある SOAP メッセージングを有効化する各オペレーションに <reliable-delivery> 下位要素を追加し、次の属性 (省略可能) を指定します。
    • duplicate-elimination - 同じ送信側アプリケーションによる、同じメッセージ ID を持つ重複呼び出しを WebLogic Web サービスで無視するかどうかを指定するブール。デフォルト値は True です。
    • persist-duration - Web サービスを呼び出した送信側から受信した信頼性のある SOAP メッセージの履歴を Web サービスがストレージで保持する最小秒数を指定する整数値。persist-duration の秒数が経過すると、受信側 WebLogic Server はメッセージの履歴をストアから削除します。この属性の値 (設定する場合) は、送信側の再試行間隔と再試行回数の積よりも大きい値を指定します。
    • この属性によって、「受信側 WebLogic Server をコンフィグレーションする」で設定したサーバのデフォルト値がオーバーライドされます。いずれも未設定の場合のデフォルト値は 360 秒です。

    次の例は、確実に呼び出せるオペレーションを示しています。

    <operation name="getQuote"
    component="simpleStockQuoteBean"
    method="getQuote">
    <reliable-delivery persist-duration="80" />
    </operation>

 

フッタのナビゲーションのスキップ  ページの先頭 前 次