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

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

高度な JWS プログラミング : 非同期機能の実装

以下の節では、JWS ファイルを使用して非同期機能を実装する方法について説明します。最初の 4 つの節では、これらの機能を個別に実装する方法を説明します。ただし通常、プログラマはこれらの機能を併用します。詳細については、「非同期機能の併用」を参照してください。

 


Web サービスの信頼性のあるメッセージングの使用

Web サービスの信頼性のあるメッセージングとは、ある 1 つのアプリケーション サーバで実行中のアプリケーションが、別のアプリケーション サーバで実行中の Web サービスを確実に呼び出せるフレームワークです。ここでは、双方のサーバで WS-ReliableMessaging 仕様が実装されていることが前提となっています。信頼性のある、とは 2 つの Web サービス間でのメッセージの配信を保証できるということです。

注意 : Web サービスの信頼性のあるメッセージングは、WS-ReliableMessaging 仕様が実装された任意の 2 つのアプリケーション サーバ間で機能します。しかしこのマニュアルでは、この 2 つのアプリケーション サーバを、WebLogic Server インスタンスであると想定しています。

WebLogic Web サービスは、WS-ReliableMessaging 仕様 (2005 年 2 月) に準拠しています。これは、別々のアプリケーション サーバで実行されている 2 つの Web サービスが、ソフトウェア コンポーネント、システム、またはネットワークに障害が発生していても、確実に通信できる方法について記述したものです。具体的には、この仕様ではソース エンドポイント (つまりクライアント Web サービス) から送り先エンドポイント (つまりオペレーションを確実に呼び出せる Web サービス) へ送信されるメッセージが、1 つまたは複数の配信保証に基づいて確実に配信されるか、そうでなければ必ずエラーが送出される、相互運用性を備えたプロトコルについて説明しています。

信頼性のある WebLogic Web サービスには、以下の配信保証が備わっています。

Web サービスの信頼性のあるメッセージングのアーキテクチャの詳細については、 WS-ReliableMessaging 仕様を参照してください。「Web サービスの信頼性のあるメッセージングの使用 : 主な手順」では、信頼性のある Web サービスおよびクライアント Web サービスを作成する方法と、それらの Web サービスがデプロイされる 2 つの WebLogic Server インスタンスをコンフィグレーションする方法について説明します。

注意 : Web サービスの信頼性のあるメッセージングは、JMS 転送機能ではサポートされません。

Web サービスの信頼性のあるメッセージングをコンフィグレーションするための WS-Policy ファイルの使用

WebLogic Web サービスでは、送り先エンドポイントが Web サービスの信頼性のあるメッセージングの機能と要件を記述および公開できるようにする、WS-Policy ファイルを使用します。WS-Policy 仕様では、Web サービスのポリシーを記述して通信するための、汎用的なモデルと構文が提供されています。

これらの WS-Policy ファイルは、サポートされている WS-ReliableMessaging 仕様のバージョン、ソース エンドポイントの再送信間隔、送り先エンドポイントの確認応答間隔などの特徴が記述された、XML ファイルです。

Web サービスに追加された WS-Policy ファイルの名前は、JWS ファイル内の @Policy JWS アノテーションを使用して指定します。複数の @Policy アノテーションをグループ化するには、@Policies アノテーションを使用します。信頼性のあるメッセージングを行うには、これらのアノテーションを、クラス レベルでのみ使用します。

WebLogic Server では、ユーザ独自の WS-Policy ファイルを作成しない場合に JWS ファイルで指定できる、2 つの単純な WS-Policy ファイルが用意されています。

あらかじめパッケージ化されているこれらのファイルは、変更することができません。したがって、ファイル内の値がニーズに合わない場合は、独自の WS-Policy ファイルを作成する必要があります。

WebLogic Server 付属のものを使用しない場合の、独自の WS-Policy ファイル作成の詳細については、「Web サービスの信頼性のあるメッセージングの WS-Policy ファイルの作成」を参照してください。信頼性のあるメッセージングのポリシーのアサーションに関するリファレンス情報については、「Web サービスの信頼性のあるメッセージングのポリシー アサーションに関するリファレンス」を参照してください。

DefaultReliability.xml WS-Policy ファイル

<?xml version="1.0"?>
<wsp:Policy
xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm/policy"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:beapolicy="http://www.bea.com/wsrm/policy"
>
  <wsrm:RMAssertion >
    <wsrm:InactivityTimeout
Milliseconds="600000" />
<wsrm:BaseRetransmissionInterval
Milliseconds="3000" />
<wsrm:ExponentialBackoff />
<wsrm:AcknowledgementInterval
Milliseconds="200" />
<beapolicy:Expires Expires="P1D" optional="true"/>
</wsrm:RMAssertion>
</wsp:Policy>

LongRunningReliability.xml WS-Policy ファイル

<?xml version="1.0"?>
<wsp:Policy
xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm/policy"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:beapolicy="http://www.bea.com/wsrm/policy"
>
  <wsrm:RMAssertion >
    <wsrm:InactivityTimeout
Milliseconds="86400000" />
<wsrm:BaseRetransmissionInterval
Milliseconds="3000" />
<wsrm:ExponentialBackoff />
<wsrm:AcknowledgementInterval
Milliseconds="200" />
<beapolicy:Expires Expires="P1M" optional="true"/>
</wsrm:RMAssertion>
</wsp:Policy>

Web サービスの信頼性のあるメッセージングの使用 : 主な手順

WebLogic Web サービスの信頼性のあるメッセージングのコンフィグレーションには、JMS サーバやストア アンド フォワード (SAF) エージェントの作成など標準的な JMS タスクと共に、JWS ファイルへの付加的な JWS アノテーションの追加など Web サービス固有のタスクが必要です。また必要に応じて、あらかじめパッケージ化されているファイルを使用しない場合は、信頼性のある Web サービスの信頼性のあるメッセージング機能を記述した WS-Policy ファイルをユーザ側で作成します。

信頼性のある Web サービスの呼び出しに WebLogic クライアント API を使用している場合、クライアント アプリケーションは WebLogic Server 上で実行される必要があります。したがってコンフィグレーション タスクは、信頼性のある Web サービスを確実に呼び出すクライアント コードを含む Web サービスがデプロイされたソース WebLogic Server インスタンスと、信頼性のある Web サービスそのものがデプロイされた送り先 WebLogic Server インスタンスの、双方の上で実行される必要があります。

以下の手順では、信頼性のある Web サービスと、その信頼性のある Web サービスのオペレーションを確実に呼び出すクライアント Web サービスを作成する方法を説明しています。この手順では、2 つの Web サービスを実装する JWS ファイルをゼロから作成する方法を示しています。既存の JWS ファイルを更新する場合は、この手順をガイドとして利用してください。またこの手順では、ソース WebLogic Server インスタンスと送り先 WebLogic Server インスタンスのコンフィグレーション方法も示しています。

WebLogic Server インスタンスが Ant ベースの開発環境を設定して作成されており、かつ jwsc Ant タスクを実行して、生成された信頼性のある Web サービスをデプロイするためのターゲットを追加できる、作業用の build.xml ファイルがあることが前提となっています。さらに、Web サービスを確実に呼び出すクライアント Web サービスをホストする、別の WebLogic Server インスタンスを同様に設定してあることも前提となっています。詳細については以下を参照してください。

  1. Web サービスの信頼性のあるメッセージングのための送り先 WebLogic Server インスタンスをコンフィグレーションします。
  2. これは、信頼性のある Web サービスがデプロイされる WebLogic Server インスタンスです。

    送り先 WebLogic Server インスタンスのコンフィグレーション」を参照してください。

  3. Web サービスの信頼性のあるメッセージングのためのソース WebLogic Server インスタンスをコンフィグレーションします。
  4. これは、信頼性のある Web サービスを呼び出すクライアント Web サービスがデプロイされる WebLogic Server インスタンスです。

    ソース WebLogic Server インスタンスのコンフィグレーション」を参照してください。

  5. 任意の XML またはプレーン テキスト エディタを使用し、必要に応じて送り先 WebLogic Server 上で実行されている Web サービスの信頼性のあるメッセージング機能が記述された WS-Policy ファイルを作成します。WebLogic Server に付属している 2 つの WS-Policy ファイルのうち一方を使用する場合、この手順は不要です。詳細については、「Web サービスの信頼性のあるメッセージングをコンフィグレーションするための WS-Policy ファイルの使用」を参照してください。
  6. 独自の WS-Policy ファイルの作成の詳細については、「Web サービスの信頼性のあるメッセージングの WS-Policy ファイルの作成」を参照してください。

  7. 送り先 WebLogic Server 上で実行される信頼性のある Web サービスを実装する、新しい JWS ファイルを作成するか、既存の JWS ファイルを更新します。
  8. 信頼性のある JWS ファイルに関するプログラミングのガイドライン」を参照してください。

  9. 信頼性のある JWS ファイルを Web サービスにコンパイルする、jwsc Ant タスクへの呼び出しを含むよう、build.xml ファイルを更新します。
  10. jwsc タスクの使用に関する全般的な情報については、「jwsc WebLogic Web サービス Ant タスクの実行」を参照してください。

  11. 適切な対象を呼び出して送り先 JWS ファイルをコンパイルし、送り先 WebLogic Server にデプロイします。次に例を示します。
  12. prompt> ant build-mainService deploy-mainService
  13. 信頼性のある Web サービスを呼び出すクライアント Web サービスを実装する新しい JWS ファイルを作成するか、既存の JWS ファイルを更新します。このサービスは、ソース WebLogic Server にデプロイされます。
  14. 信頼性のある Web サービスを呼び出す JWS ファイルに関するプログラミングのガイドライン」を参照してください。

  15. クライアント Web サービスをビルドする build.xml ファイルを更新します。
  16. 信頼性のある Web サービスのクライアント用 build.xml ファイルの更新」を参照してください。

  17. 適切な対象を呼び出してクライアント JWS ファイルをコンパイルし、ソース WebLogic Server にデプロイします。次に例を示します。
  18. prompt> ant build-clientService deploy-clientService

送り先 WebLogic Server インスタンスのコンフィグレーション

信頼性のある Web サービスがデプロイされる WebLogic Server インスタンスをコンフィグレーションする際には、JMS およびストア アンド フォワード (SAF) リソースがコンフィグレーションされます。

これらのリソースは手作業でもコンフィグレーションできますが、コンフィグレーション ウィザードで、Web サービス固有の拡張テンプレートを使用して WebLogic Server ドメインを拡張することもできます。コンフィグレーション ウィザードを使用すると、必要なコンフィグレーション手順を大幅に簡略化できます。詳細については、「Web サービス機能用のドメイン コンフィグレーション」を参照してください。

リソースを手作業でコンフィグレーションしたい場合は、次に示す高度な手順に従ってください。各タスクの実行方法の詳細については、リンクが示されている Administration Console オンライン ヘルプのトピックを参照してください。

  1. 送り先 WebLogic Server が格納されたドメインの Administration Console をブラウザで起動します。
  2. Administration Console を起動する URL に関する手順については、「Administration Console の起動」を参照してください。

  3. 必要に応じて、送り先 WebLogic Server が Web サービスの信頼性のあるメッセージングの内部情報を格納するために使用する永続ストア (ファイルまたは JDBC) を作成します。新規作成しない場合は、既存のものを使用するか、常に存在するデフォルトのストアを使用できます。
  4. ファイル ストアの作成」を参照してください。

  5. JMS サーバを作成します。JMS サーバがすでに存在する場合は、新しい JMS サーバを作成せずにそれを使用することができます。
  6. JMS サーバの作成」を参照してください。

  7. JMS モジュールを作成し、その中で JMS キューを定義します。JMS モジュールがすでに存在する場合は、新しい JMS モジュールを作成せずにそれを使用することができます。JMS キューを、1 つ前の手順で作成した JMS サーバに対象指定します。必ず、この JMS キューがローカルであることを指定してください。通常は、ローカル JNDI 名を設定することで指定できます。
  8. 後に信頼性のある Web サービスを実装する JWS ファイルをプログラムする際に使用するので、JMS キュー用に定義した JNDI 名は覚えておいてください。

    JMS システム モジュールの作成」および「システム モジュールのキューの作成」を参照してください。

  9. ストア アンド フォワード (SAF) エージェントを作成します。新規作成しない場合は、既存のものを使用できます。
  10. SAF エージェントを作成する場合は、次の作業を行います。

    • [エージェントの種類] フィールドを [両方] に設定して、送信エージェントと受信エージェントの双方を有効化する。
    • 最初のアシスタント ページで [完了] ではなく [次へ] をクリックして、必ず WebLogic Server インスタンスに SAF エージェントを対象指定する。
    • ストア アンド フォワード エージェントの作成」を参照してください。

クラスタに関する考慮事項

クラスタ内で Web サービスの信頼性のあるメッセージング機能を使用する場合は、以下の作業を行う必要があります。

ソース WebLogic Server インスタンスのコンフィグレーション

クライアント Web サービスがデプロイされる WebLogic Server インスタンスをコンフィグレーションする際には、JMS およびストア アンド フォワード (SAF) リソースがコンフィグレーションされます。

これらのリソースは手作業でもコンフィグレーションできますが、コンフィグレーション ウィザードで、Web サービス固有の拡張テンプレートを使用して WebLogic Server ドメインを拡張することもできます。コンフィグレーション ウィザードを使用すると、必要なコンフィグレーション手順を大幅に簡略化できます。詳細については、「Web サービス機能用のドメイン コンフィグレーション」を参照してください。

リソースを手作業でコンフィグレーションしたい場合は、次に示す高度な手順に従ってください。各タスクの実行方法の詳細については、リンクが示されている Administration Console オンライン ヘルプのトピックを参照してください。

  1. ソース WebLogic Server が格納されたドメインの Administration Console をブラウザで起動します。
  2. Administration Console を起動する URL に関する手順については、「Administration Console の起動」を参照してください。

  3. ソース WebLogic Server が Web サービスの信頼性のあるメッセージングの内部情報を格納するために使用する永続ストア (ファイルまたは JDBC) を作成します。新規作成しない場合は、既存のものを使用できます。
  4. ファイル ストアの作成」を参照してください。

  5. JMS サーバを作成します。新規作成しない場合は、既存のものを使用できます。
  6. JMS サーバの作成」を参照してください。

  7. ストア アンド フォワード (SAF) エージェントを作成します。新規作成しない場合は、既存のものを使用できます。
  8. SAF エージェントを作成する際は、送信エージェントと受信エージェントの両方を有効にするために、必ず [エージェントの種類] フィールドを [両方] に設定してください。

    ストア アンド フォワード エージェントの作成」を参照してください。

Web サービスの信頼性のあるメッセージングの WS-Policy ファイルの作成

WS-Policy ファイルは、WS-Policy 仕様に準拠するポリシー アサーションを含む XML ファイルです。この場合には、WS-Policy ファイルに Web サービスの信頼性のあるメッセージング ポリシーのアサーションが含まれています。

WebLogici Server に含まれる 2 つのデフォルトの信頼性のあるメッセージング WS-Policy ファイルのうち一方を使用できます。これらのファイルは、ほとんどの場合に適合しています。しかし、これらのファイルは変更ができないので、ニーズに合わない場合は独自のファイルを作成することが必要です。付属の WS-Policy ファイルについては、「Web サービスの信頼性のあるメッセージングをコンフィグレーションするための WS-Policy ファイルの使用」を参照してください。この節のこれ以降では、ユーザ独自の WS-Policy ファイルの作成方法について説明します。

WS-Policy ファイルのルート要素は <Policy> です。Web サービスの信頼性のあるメッセージング ポリシーのアサーションを使用するには、これに以下のネームスペース宣言が含まれていることが必要です。

<wsp:Policy
xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:beapolicy="http://www.bea.com/wsrm/policy">

Web サービスの信頼性のあるメッセージング ポリシーのアサーションはすべて、<wsrm:RMAssertion> 要素の内部でラップします。wsrm: ネームスペースを使用するアサーションは、WS-ReliableMessaging 仕様で定義される標準的なアサーションです。beapolicy: ネームスペースを使用するアサーションは、WebLogic 固有のものです。詳細については、「Web サービスの信頼性のあるメッセージングのポリシー アサーションに関するリファレンス」を参照してください。

Web サービスの信頼性のあるメッセージングのアサーションは、すべて任意指定なので、デフォルト値が不適切なものだけを設定します。アサーションの指定順序は重要です。以下のアサーションを指定できますが、WS-Policy ファイルでは以下の一覧の順序どおりに指定する必要があります。

次の例では、簡単な Web サービスの信頼性のあるメッセージングの WS-Policy ファイルを示します。

<?xml version="1.0"?>
<wsp:Policy
xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm/policy"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:beapolicy="http://www.bea.com/wsrm/policy"
>
 <wsrm:RMAssertion >
   <wsrm:InactivityTimeout
Milliseconds="600000" />
<wsrm:BaseRetransmissionInterval
Milliseconds="500" />
<wsrm:ExponentialBackoff />
<wsrm:AcknowledgementInterval
Milliseconds="2000" />
 </wsrm:RMAssertion>
</wsp:Policy>

信頼性のある JWS ファイルに関するプログラミングのガイドライン

この節では、信頼性のある Web サービスを実装する JWS ファイルの作成方法を説明します。

信頼性のある Web サービスを実装する JWS ファイルでは、次の JWS アノテーションが使用されます。

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

package examples.webservices.reliable;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.Oneway;
import weblogic.jws.WLHttpTransport;
import weblogic.jws.ReliabilityBuffer;
import weblogic.jws.BufferQueue;
import weblogic.jws.Policy;
/**
 * 簡単な信頼性のある Web サービス
 */
@WebService(name="ReliableHelloWorldPortType",
serviceName="ReliableHelloWorldService")
@WLHttpTransport(contextPath="ReliableHelloWorld",
serviceUri="ReliableHelloWorld",
portName="ReliableHelloWorldServicePort")
@Policy(uri="ReliableHelloWorldPolicy.xml",
direction=Policy.Direction.both,
attachToWsdl=true)
@BufferQueue(name="webservices.reliable.queue")
public class ReliableHelloWorldImpl {
  @WebMethod()
@Oneway()
@ReliabilityBuffer(retryCount=10, retryDelay="10 seconds")
  public void helloWorld(String input) {
System.out.println(" Hello World " + input);
  }
}

このサンプルでは、ReliableHelloWorldPolicy.xml ファイルがクラス レベルで Web サービスに追加されています。つまり、ポリシー ファイルは Web サービスのすべてのパブリック オペレーションに適用されます。ポリシー ファイルは、リクエスト Web サービス メッセージ (信頼性のあるメッセージング機能によって要求される) のみに適用され、WSDL ファイルに追加されます。

WebLogic Server が、Web サービスの信頼性のあるメッセージングを有効化するために内部で使用する JMS キューの JNDI 名は、@BufferQueue アノテーションで指定されているように、webservices.reliable.queue です。

helloWorld() メソッドは、@WebMethod@Oneway、どちらの JWS アノテーションでもマークされています。これは、このメソッドが helloWorld というパブリック オペレーションであるということです。@Policy アノテーションがあるために、オペレーションを確実に呼び出すことができます。@ReliabilityBuffer アノテーションに記述されているとおり、Web サービスのランタイムでは、最大で 10 回、10 秒間隔で、信頼性のあるメッセージをサービスに配信しようとします。たとえば、トランザクションがロールバックされる場合や、コミットしない場合などには、メッセージの再配信が必要となることがあります。

@Policy アノテーションの使用

信頼性のあるメッセージングのアサーションが含まれる WS-Policy ファイルを Web サービスに追加するよう指定するには、JWS ファイルで @Policy アノテーションを使用します。

独自に記述する代わりに使用できる、WebLogic Server で用意されている 2 つの WS-Policy ファイル (DefaultReliability.xml および LongRunningReliability.xml) については、「Web サービスの信頼性のあるメッセージングをコンフィグレーションするための WS-Policy ファイルの使用」を参照してください。

@Policy アノテーションを Web サービスの信頼性のあるメッセージングに使用する場合、以下の要件を満たしている必要があります。

uri 属性を使用して、ポリシー ファイルのビルド時の場所を以下のように指定します。

また、@Policy アノテーションの attachToWsd 属性を設定して、ポリシー ファイルを Web サービスのパブリック規約が記述された WSDL ファイルに付加するかどうかを指定することもできます。通常は、クライアント アプリケーションで Web サービスの信頼性のあるメッセージング機能が認識されるよう、パブリックなものとしてポリシーを公開します。そのため、この属性のデフォルト値は true です。

@Oneway アノテーションを使用する

信頼性のある Web サービスのオペレーションを同期的に呼び出す (すなわち、非同期の要求と応答機能を使用しない) 場合は、実装メソッドに @Oneway アノテーションを付けて、そのメソッドが一方向のものであることを指定する必要があります。つまり、メソッドは値を返すことができず、明示的に void を返すことになります。

反対に、メソッドに @Oneway アノテーションが付いていなければ、非同期の要求と応答機能を使用して呼び出す必要があります。オペレーションの呼び出し方法がわからない場合は、同期と非同期の 2 種類のオペレーションを作成することを検討してください。

非同期の要求と応答を使用した Web サービスの呼び出し」および「非同期機能の併用」を参照してください。

@BufferQueue アノテーションの使用

信頼性のあるメッセージを内部に格納するために WebLogic Server が使用する JMS キューの JNDI 名を指定するには、@BufferQueue アノテーションを使用します。JNDI 名は、「送り先 WebLogic Server インスタンスのコンフィグレーション」の手順 4 で JMS キューを作成した際に、コンフィグレーションしたものです。

@BufferQueue アノテーションは、省略可能です。これを JWS ファイルで指定しなければ、WebLogic Server は weblogic.wsee.DefaultQueue の JNDI 名を持つキューを使用します。ただし、それでもこの JNDI 名を持つ JMS キューを Administration Console で明示的に作成する必要はあります。

@ReliabilityBuffer アノテーションの使用

このアノテーションは、WebLogic Server による JMS キューから Web サービス実装へのメッセージ配信試行回数 (デフォルトでは 3 回)、およびサーバが待機すべき再試行間隔 (デフォルトでは 5 秒) の指定に使用します。

再試行回数の指定には retryCount 属性を、待機時間の指定には retryDelay 属性を使用します。retryDelay 属性の形式としては、数字の後に以下の文字列のうち 1 つを続けます。

たとえば、再試行回数を 20、再試行の遅延を 2 日と指定するには、次の構文を使用します。

@ReliabilityBuffer(retryCount=20, retryDelay="2 days")

信頼性のある Web サービスを呼び出す JWS ファイルに関するプログラミングのガイドライン

WebLogic クライアント API を使用している場合は、信頼性のある Web サービスを Web サービス内から呼び出す必要があります。スタンドアロンのクライアント アプリケーションからは呼び出せません。

次の例では、「信頼性のある JWS ファイルに関するプログラミングのガイドライン」で説明した、サービスから信頼性のあるオペレーションを呼び出す Web サービス用の簡単な JWS ファイルを示します。太字で示された Java コードに対応するコーディングのガイドラインについては、サンプルの後の説明を参照してください。

package examples.webservices.reliable;
import java.rmi.RemoteException;
import javax.jws.WebMethod;
import javax.jws.WebService;
import weblogic.jws.WLHttpTransport;
import weblogic.jws.ServiceClient;
import weblogic.jws.ReliabilityErrorHandler;
import examples.webservices.reliable.ReliableHelloWorldPortType;
import weblogic.wsee.reliability.ReliabilityErrorContext;
import weblogic.wsee.reliability.ReliableDeliveryException;
@WebService(name="ReliableClientPortType",
serviceName="ReliableClientService")
@WLHttpTransport(contextPath="ReliableClient",
serviceUri="ReliableClient",
portName="ReliableClientServicePort")
public class ReliableClientImpl
{
  @ServiceClient(
serviceName="ReliableHelloWorldService",
portName="ReliableHelloWorldServicePort")
  private ReliableHelloWorldPortType port;
  @WebMethod
public void callHelloWorld(String input, String serviceUrl)
throws RemoteException {
    port.helloWorld(input);
    System.out.println(" Invoked the ReliableHelloWorld.helloWorld operation reliably." );
  }
  @ReliabilityErrorHandler(target="port")
public void onReliableMessageDeliveryError(ReliabilityErrorContext ctx) {
    ReliableDeliveryException fault = ctx.getFault();
String message = null;
if (fault != null) {
message = ctx.getFault().getMessage();
}
String operation = ctx.getOperationName();
System.out.println("Reliable operation " + operation + " may have not invoked. The error message is " + message);
}
}

信頼性のある Web サービスを呼び出す JWS ファイルをプログラミングする際には、以下のガイドラインに従います。ガイドラインのコード例は、上述のサンプル内では太字で示されています。

クライアント Web サービスをプログラミングする際は、以下の点に注意してください。

WsrmUtils ユーティリティ クラス

WebLogic Server には、Web サービスの信頼性のあるメッセージング機能で使用するユーティリティ クラスが用意されています。このクラスを使用すると、オプションのコンフィグレーション、シーケンス ID の取得、信頼性のあるシーケンスの終了、といった一般的なタスクを実行できます。これらのタスクには、信頼性のある Web サービス内で実行するものと、信頼性のある Web サービスを呼び出す Web サービス内で実行するものがあります。

詳細については、weblogic.wsee.reliability.WsrmUtils を参照してください。

信頼性のある Web サービスのクライアント用 build.xml ファイルの更新

build.xml を更新して、信頼性のある Web サービスのオペレーションを呼び出す JWS ファイルを生成するには、次のような taskdefs および build-reliable-client ターゲットを追加します。詳細については、サンプルの後の説明を参照してください。

<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
<target name="build-reliable-client">
    <jwsc
enableAsyncService="true"
srcdir="src"
destdir="${client-ear-dir}" >
        <jws file="examples/webservices/reliable/ReliableClientImpl.java">
          <clientgen
wsdl="http://${wls.destination.host}:${wls.destination.port}/ReliableHelloWorld/ReliableHelloWorld?WSDL"
packageName="examples.webservices.reliable"/>
        </jws>
    </jwsc>
</target>

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

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

信頼性のある Web サービスを再デプロイする際にクライアント側で考慮すべき事項

WebLogic Server では、プロダクションの再デプロイメントがサポートされています。つまり、信頼性のある WebLogic Web サービスの更新後の新しいバージョンを、同じ Web サービスの古いバージョンと並行してデプロイできます。

WebLogic Server では、新しいクライアントのリクエストのみが新しいバージョンに転送されるように、クライアント接続が自動的に管理されます。再デプロイメント時にすでに Web サービスに接続していたクライアントは、作業が完了するまで古いバージョンのサービスを使用し続けます。作業が完了した時点で、自動的に古い Web サービスが廃止されます。クライアントが信頼性のある Web サービスに接続されている場合は、既存の信頼性のあるメッセージ シーケンスがクライアントによって明示的に終了されるか、またはタイムアウトになったときに、そのクライアントの作業が完了したと見なされます。

プロダクションの再デプロイメントと Web サービス クライアントの詳細については、「Web サービスを再デプロイする際にクライアント側で考慮すべき事項」を参照してください。

 


非同期の要求と応答を使用した Web サービスの呼び出し

Web サービスを同期的に呼びだす場合、呼び出し側のクライアント アプリケーションは、応答が返るまで待機してから、処理を続行します。応答が即座に返る場合であれば、この Web サービス呼び出しの方法は、適切であると考えられます。しかし、要求の処理が遅延される可能性があるため、クライアント アプリケーションによる処理を続行し、応答への対処は後で行うようにする、すなわち、WebLogic Web サービスにおける非同期の要求と応答機能を使用すると便利なことがよくあります。

Web サービスの非同期的な呼び出しは、WebLogic Web サービスで実行されているクライアントからのみ行います。スタンドアロンのクライアント アプリケーションから行うことはありません。呼び出された Web サービスは、まったく変更されません。したがって、Web サービスをホストするアプリケーション サーバが WS-Addressing 仕様をサポートしている限り、任意のデプロイ済み Web サービス (WebLogic のものも、それ以外のものも) を非同期的に呼び出せます。

クライアントで非同期の要求と応答を実装するには、オペレーションを直接呼びだすよりも、非同期な種類の同じオペレーションを呼び出します (この非同期な種類のオペレーションは、jwsc Ant タスクによって自動生成されます)。たとえば、getQuote というオペレーションを直接呼び出すのではなく、getQuoteAsync を呼び出します。非同期な種類のオペレーションは、オリジナルのオペレーションが値を返す場合でも、常に void を返します。その後クライアントに、非同期の応答を処理するメソッド、または後で応答が返る場合はエラーを格納します。これらのメソッド内には、Web サービスのオペレーション呼び出しに対する戻り値、または潜在的なエラーを処理する、すべてのビジネス ロジックを置きます。これらのメソッドを JWS コンパイラに対して指定するには、命名規約と JWS アノテーションの双方を使用します。たとえば、非同期のオペレーションが getQuoteAsync というものである場合、これらのメソッドは onGetQuoteAsyncResponse および onGetQuoteAsyncFailure になり得ます。

注意 : Web サービスの信頼性のあるメッセージングやバッファリングなど、他の非同期機能と共に、非同期の要求と応答を使用する場合については、「非同期機能の併用」を参照してください。この節では、非同期の要求と応答機能を単独で使用する方法を説明しています。
注意 : 非同期の要求と応答機能は、HTTP でのみ動作します。HTTPS または JMS 転送では使用できません。

非同期の要求と応答の使用 : 主な手順

次の手順では、他の Web サービス内に非同期的にオペレーションを呼び出すクライアント Web サービスの作成方法を説明します。この手順では、クライアント Web サービスを実装する JWS ファイルをゼロから作成する方法を示しています。既存の JWS ファイルを更新する場合は、この手順をガイドとして利用してください。

分かりやすくするために、この手順では以下の想定を行っています。

さらには、Ant ベースの開発環境を設定済みであり、かつ jwsc Ant タスクを実行して、生成されたサービスをデプロイするためのターゲットを追加できる、作業用の build.xml ファイルがあることが前提となっています。「一般的な Web サービスの使用例とサンプル」、「WebLogic Web サービスの反復的な開発」、および「JWS ファイルのプログラミング」を参照してください。

  1. 任意の IDE またはテキスト エディタを使用して、StockQuoteClientService Web サービスを実装する新しい JWS ファイルを作成するか、既存の JWS ファイルを更新します。
  2. 非同期の JWS ファイルの記述」を参照してください。

  3. build.xml ファイルを更新して、StockQuoteClientService を実装する JWS ファイルがコンパイルされるようにします。jwsc Ant タスクの <clientgen> 子要素によって、呼び出している非同期な種類の Web サービス オペレーションが自動的に生成されます。
  4. 非同期の要求と応答を使用する場合の build.xml ファイルの更新」を参照してください。

  5. Ant ターゲットを実行して、StockQuoteClientService をビルドします。
  6. prompt> ant build-clientService
  7. 通常のように、StockQuoteClientService Web サービスをデプロイします。
  8. WebLogic Web サービスのデプロイとアンデプロイ」を参照してください。

StockQuoteClientService Web サービスを呼び出すと、その Web サービスが StockQuoteService Web サービスを呼び出します。この 2 回目の呼び出しは、同期ではなく非同期のものになります。

非同期の JWS ファイルの記述

次のサンプルでは、StockQuoteClient という Web サービスを実装する簡単な JWS ファイルを示します。この Web サービスには、asyncOperation という単一のメソッドがあり、これが非同期的に、StockQuote サービスの getQuote メソッドを呼び出します。太字で示された Java コードについては、「Web サービスの非同期な呼び出しのコーディングに関するガイドライン」で説明します。この非同期呼び出しが、同じオペレーションの同期呼び出しとどう違うのかについては、「同期呼び出しのサンプル」を参照してください。

package examples.webservices.async_req_res;
import weblogic.jws.WLHttpTransport;
import weblogic.jws.ServiceClient;
import weblogic.jws.AsyncResponse;
import weblogic.jws.AsyncFailure;
import weblogic.wsee.async.AsyncPreCallContext;
import weblogic.wsee.async.AsyncCallContextFactory;
import weblogic.wsee.async.AsyncPostCallContext;
import javax.jws.WebService;
import javax.jws.WebMethod;
import examples.webservices.async_req_res.StockQuotePortType;
import java.rmi.RemoteException;
@WebService(name="StockQuoteClientPortType",
serviceName="StockQuoteClientService",
targetNamespace="http://examples.org/")
@WLHttpTransport(contextPath="asyncClient",
serviceUri="StockQuoteClient",
portName="StockQuoteClientServicePort")
/**
 * StockQuote サービスを非同期に呼び出すクライアント Web サービス
 */
public class StockQuoteClientImpl {
  @ServiceClient(wsdlLocation="http://localhost:7001/async/StockQuote?WSDL",
serviceName="StockQuoteService", portName="StockQuote")
  private StockQuotePortType port;
  @WebMethod
public void asyncOperation (String symbol) throws RemoteException {
    AsyncPreCallContext apc = AsyncCallContextFactory.getAsyncPreCallContext();
apc.setProperty("symbol", symbol);
    try {
port.getQuoteAsync(apc, symbol );
System.out.println("in getQuote method of StockQuoteClient WS");
     } catch (RemoteException re) {
        System.out.println("RemoteException thrown");
throw new RuntimeException(re);
}
  }
  @AsyncResponse(target="port", operation="getQuote")
public void onGetQuoteAsyncResponse(AsyncPostCallContext apc, int quote) {
System.out.println("-------------------");
System.out.println("Got quote " + quote );
System.out.println("-------------------");
}
  @AsyncFailure(target="port", operation="getQuote")
public void onGetQuoteAsyncFailure(AsyncPostCallContext apc, Throwable e) {
System.out.println("-------------------");
e.printStackTrace();
System.out.println("-------------------");
}
}

Web サービスの非同期な呼び出しのコーディングに関するガイドライン

オペレーションを非同期に呼び出すための以下のガイドラインは、「非同期の JWS ファイルの記述」に記載のサンプルにおいて太字で示した Java コードに対応しています。これらのガイドラインは、JWS ファイル作成のための標準的なガイドラインへの付け加えです。この非同期呼び出しが、同じオペレーションの同期呼び出しとどう違うのかについては、「同期呼び出しのサンプル」を参照してください。

JWS ファイルにオペレーションの非同期呼び出しを行う方法は次のとおりです。

注意 : @AsyncResponse アノテーションおよび @AsyncFailure アノテーションの使用は、曖昧な点がすべて明瞭化され、JWS ファイルが明確かつ理解しやすいものになるため、お勧めしますが、必須ではありません。ただし、onXXX メソッドの 1 つで、同じ名前を持つ別々の 2 つの Web サービスからオペレーションを呼び出している 2 つ (またはそれ以上) のスタブからの非同期応答またはエラーを処理する場合は、これらのアノテーションの使用を明示的に避ける必要があります。onXXX メソッドの名前は必ず、上述した正しい命名規約に厳密に準拠するようにしてください。

同期呼び出しのサンプル

以下のサンプルでは、StockQuote Web サービスの getQuote オペレーションを同期的に呼び出す JWS ファイルを示します。このサンプルは、「非同期の JWS ファイルの記述」に示した、対応する非同期呼び出しとの比較目的でのみ示されています。

package examples.webservices.async_req_res;
import weblogic.jws.WLHttpTransport;
import weblogic.jws.ServiceClient;
import javax.jws.WebService;
import javax.jws.WebMethod;
import java.rmi.RemoteException;
@WebService(name="SyncClientPortType",
serviceName="SyncClientService",
targetNamespace="http://examples.org/")
@WLHttpTransport(contextPath="syncClient",
serviceUri="SyncClient",
portName="SyncClientPort")
/**
 * StockQuote サービスを同期的に呼び出す通常のサービス間
 * クライアント
 */
public class SyncClientImpl {
  @ServiceClient(wsdlLocation="http://localhost:7001/async/StockQuote?WSDL",
serviceName="StockQuoteService", portName="StockQuote")
private StockQuotePortType port;
  @WebMethod
public void nonAsyncOperation(String symbol) throws RemoteException {
    int quote = port.getQuote(symbol);
    System.out.println("-------------------");
System.out.println("Got quote " + quote );
System.out.println("-------------------");
  }
}

非同期の要求と応答を使用する場合の build.xml ファイルの更新

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

<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
<target name="build-clientService">
    <jwsc
enableAsyncService="true"
srcdir="src"
destdir="${clientService-ear-dir}" >
        <jws file="examples/webservices/async_req_res/StockQuoteClientImpl.java" >
          <clientgen
wsdl="http://${wls.hostname}:${wls.port}/async/StockQuote?WSDL"
packageName="examples.webservices.async_req_res"/>
        </jws>
    </jwsc>
</target>

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

クライアント Web サービスをコンパイルする jwsc Ant タスクを更新して、<jws> 要素の <clientgen> 子要素を含めます。これにより、デプロイされた StockQuote Web サービスの JAX-RPC スタブが生成およびコンパイルされるようになります。jwsc Ant タスクでは、これらのスタブが自動的に呼び出し側の Web サービスの WAR ファイルにパッケージ化されるため、即座に Web サービスからアクセスできるようになります。この場合のデフォルトでは、jwsc Ant タスクは JAX-RPC スタブ内に Web サービス オペレーションの同期した種類のものと非同期な種類のものを両方とも生成します。このようにするのは、生成されたクラスの 1 つを StockQuoteClientImpl JWS ファイルでインポートして使用するためです。

内部非同期サービスの無効化

デフォルトでは、すべての WebLogic Server インスタンスに、非同期の要求と応答機能を処理する内部非同期 Web サービスがデプロイされます。この内部サービスがデプロイされないようにするには、-Dweblogic.wsee.skip.async.response=true Java システム プロパティを使用して WebLogic Server インスタンスを起動します。

非同期サービスを無効にするケースとしては、WebLogic Server インスタンスを WebLogic クラスタへの Web プロキシとして使用する場合が考えられます。この場合、クラスタ宛に非同期メッセージが送信されても、プロキシ サーバ上の非同期サービスによって消費されてしまうためクラスタには届きません。このような理由から、プロキシ サーバ上の非同期サービスは、上記のシステム プロパティを使用して無効にする必要があります。

Java システム プロパティを指定して WebLogic Server をコンフィグレーションする方法については、「WebLogic Server インスタンスの Java オプションの指定」を参照してください。

 


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

コールバックは、何らかのイベントが発生したことを Web サービスのクライアントに通知します。たとえば、クライアントの要求に対する結果が準備できたことを通知したり、クライアントの要求を遂行できないことを通知したりできます。

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

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

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

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

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

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

  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 ファイルがあることが前提となっています。詳細については、「一般的な Web サービスの使用例とサンプル」、「WebLogic Web サービスの反復的な開発」、および「JWS ファイルのプログラミング」を参照してください。

  1. 任意の IDE を使用して、対象 Web サービスを実装する新しい JWS ファイルを作成するか、既存の JWS ファイルを更新します。
  2. 対象 Web サービスのプログラミングのガイドライン」を参照してください。

    注意 : 対象 Web サービスを実装する JWS ファイルは、コールバック インタフェースの 1 つまたは複数のコールバック メソッドを呼び出します。しかし、コールバック インタフェースをプログラミングする手順については後ほど説明します。したがって、これらの 3 つの JWS ファイルは、この手順に従って順番にプログラミングするのではなく、すべてを同時にプログラミングすることをお勧めします。手順をこの順番に説明しているのは、あくまで各手順を理解しやすくするためです。
  3. 対象の JWS ファイルを Web サービスにコンパイルする、jwsc Ant タスクへの呼び出しを含むよう、build.xml ファイルを更新します。
  4. jwsc WebLogic Web サービス Ant タスクの実行」を参照してください。

  5. Ant ターゲットを実行して、対象 Web サービスをビルドします。次に例を示します。
  6. prompt> ant build-mainService
  7. 通常のように、対象 Web サービスをデプロイします。
  8. WebLogic Web サービスのデプロイとアンデプロイ」を参照してください。

  9. 任意の IDE またはテキスト エディタを使用して、対象 Web サービスを実装する新しい JWS ファイルを作成するか、既存の JWS ファイルを更新します。クライアント Web サービスは、対象 Web サービスをホストするものとは別の WebLogic Server インスタンスにデプロイされていることが前提となっています。
  10. コールバック クライアント Web サービスのプログラミングのガイドライン」を参照してください。

  11. コールバック Web サービスを実装するコールバック JWS インタフェースを作成します。
  12. コールバック インタフェースのプログラミングのガイドライン」を参照してください。

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

  15. Ant ターゲットを実行して、クライアントおよびコールバック Web サービスをビルドします。
  16. prompt> ant build-clientService
  17. 通常のように、クライアント Web サービスをデプロイします。コールバック サービスはクライアント Web サービスと同じ EAR ファイルにパッケージ化されているため、コールバック サービスも同時にデプロイされます。
  18. 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")
/**
 * コールバック サービス
 */
public class TargetServiceImpl {
  @Callback
CallbackInterface callback;
  @WebMethod
public void targetOperation (String message) {
        callback.callbackOperation (message);
}
}

対象 Web サービスを実装する JWS ファイルをプログラミングする際には、以下のガイドラインに従います。ガイドラインのコード例は、上述のサンプルでは太字で示されています。

この節で説明した JWS アノテーションの詳細については、「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 ファイルをプログラミングする際には、以下のガイドラインに従います。ガイドラインのコード例は、上述のサンプル内では太字で示されています。

この節で説明した JWS アノテーションの詳細については、「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 インタフェース ファイルをプログラミングする際には、以下のガイドラインに従います。ガイドラインのコード例は、上述のサンプルでは太字で示されています。

この節で説明した JWS アノテーションの詳細については、「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 タスクでは、これらのスタブが自動的に呼び出し側の Web サービスの WAR ファイルにパッケージ化されるため、即座に Web サービスからアクセスできるようになります。このようにするのは、生成されたクラスの 1 つを CallbackClientImpl JWS ファイルでインポートして使用するためです。

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

 


会話形式の Web サービスの作成

Web サービスと、その Web サービスが呼び出すクライアント アプリケーションは、1 つのタスクを完了するために複数回通信する場合があります。また、複数のクライアント アプリケーションが同時に同じ Web サービスと通信する場合もあります。会話を使用すると、直接的な方法で、呼び出し間のデータを追跡して、Web サービスが常に正しいクライアントに応答するようにできます。

会話を使用すると、複数の通信にわたってデータを維持することに伴う以下の 2 つの問題が解決されます。

WebLogic Server はこのユニークな ID とステートを、クライアント アプリケーションが新しく会話を開始するたびに会話コンテキストを作成することによって管理します。Web サービスがその後、このコンテキストを使用して、サービスとの間の呼び出しを相関させ、ステート関連データを永続化します。

クライアント アプリケーションと Web サービスの間の会話には、明確なフェーズが 3 つあります。

会話は通常、2 つの WebLogic Web サービス間で発生します。そのうち 1 つは会話形式のものとしてマークされ、開始、続行、および終了のオペレーションを定義します。もう 1 つの Web サービスは @ServiceClient アノテーションを使用して、それが会話形式の Web サービスのクライアントであることを指定します。また、制限事項はありますが、会話形式の Web サービスはスタンドアロン Java クライアントからも呼び出せます。

他の WebLogic Web サービスの機能と同様に、Web サービスを会話形式のものとして指定するには、JWS アノテーションを使用します。

警告 : 会話形式の Web サービスを呼び出すクライアント Web サービスは、必ずしも会話形式にする必要はありません。ただし、クライアントが会話形式でない場合は、このクライアントの複数のインスタンスが同じ会話形式の Web サービス スタブにアクセスする危険性があり、保存されている対話状態が破損するおそれがあります。この危険性があると判断した場合は、クライアント Web サービスも会話形式になるように指定してください。その場合は、スタンドアロンの Java クライアントは使用できません。これは、WebLogic API を使用して会話形式であることを指定する方法がないためです。
警告 : 会話形式の Web サービス自体は、必ず 1 回、メッセージの配信が行われることや、メッセージが順序どおりに配信されることを保証するものではありません。そのようなメッセージ配信保証が必要であれば、Web サービスが信頼性のあるものであることも指定する必要があります。「Web サービスの信頼性のあるメッセージングの使用」および「非同期機能の併用」を参照してください。

会話形式の Web サービスの作成 : 主な手順

以下の手順では、会話形式の Web サービス、ならびにクライアント Web サービスおよびスタンドアロン Java クライアント アプリケーション (いずれも会話を開始および実施するもの) を作成する方法について説明します。この手順では、2 つの Web サービスを実装する JWS ファイルをゼロから作成する方法を示しています。既存の JWS ファイルを更新する場合は、この手順をガイドとして利用することもできます。

Ant ベースの開発環境を設定済みであり、かつ jwsc Ant タスクを実行して、生成された会話形式の Web サービスをデプロイするためのターゲットを追加できる、作業用の build.xml ファイルがあることが前提となっています。さらに、会話を開始するクライアント Web サービスをホストする、WebLogic Server インスタンスを同様に設定してあることも前提となっています。詳細については、「一般的な Web サービスの使用例とサンプル」、「WebLogic Web サービスの反復的な開発」、および「JWS ファイルのプログラミング」を参照してください。

  1. 任意の IDE またはテキスト エディタを使用して、会話形式の Web サービスを実装する新しい JWS ファイルを作成するか、既存の JWS ファイルを更新します。
  2. 会話形式の JWS ファイルに関するプログラミングのガイドライン」を参照してください。

  3. 会話形式の JWS ファイルを Web サービスにコンパイルする、jwsc Ant タスクへの呼び出しを含むよう、build.xml ファイルを更新します。
  4. jwsc WebLogic Web サービス Ant タスクの実行」を参照してください。

  5. Ant ターゲットを実行して、会話形式の Web サービスをビルドします。次に例を示します。
  6. prompt> ant build-mainService
  7. 通常のように、Web サービスをデプロイします。
  8. WebLogic Web サービスのデプロイとアンデプロイ」を参照してください。

  9. クライアント アプリケーションがスタンドアロン Java クライアントである場合は、「会話形式の Web サービスを呼び出すためのスタンドアロン Java クライアントの更新」を参照してください。クライアント アプリケーション自体が Web サービスである場合は、次の手順に従います。
    1. 任意の IDE またはテキスト エディタを使用して、会話形式の Web サービスとの会話を開始および実施する、クライアント Web サービスが実装された新しい JWS ファイルを作成するか、既存の JWS ファイルを更新します。クライアント Web サービスは、会話形式の Web サービスをホストするものとは別の WebLogic Server インスタンスにデプロイされていることが前提となっています。
    2. 会話形式の Web サービスを呼び出す JWS ファイルに関するプログラミングのガイドライン」を参照してください。

    3. クライアント Web サービスをビルドする build.xml ファイルを更新します。
    4. 会話形式の Web サービスのクライアント用 build.xml ファイルの更新」を参照してください。

    5. Ant ターゲットを実行して、クライアント Web サービスをビルドします。
    6. prompt> ant build-clientService
    7. 通常のように、Web サービスをデプロイします。
    8. WebLogic Web サービスのデプロイとアンデプロイ」を参照してください。

会話形式の JWS ファイルに関するプログラミングのガイドライン

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

package examples.webservices.conversation;
import java.io.Serializable;
import weblogic.jws.WLHttpTransport;
import weblogic.jws.Conversation;
import weblogic.jws.Conversational;
import weblogic.jws.Context;
import weblogic.wsee.jws.JwsContext;
import weblogic.wsee.jws.ServiceHandle;
import javax.jws.WebService;
import javax.jws.WebMethod;
@Conversational(maxIdleTime="10 minutes",
maxAge="1 day",
runAsStartUser=false,
singlePrincipal=false )
@WebService(name="ConversationalPortType",
serviceName="ConversationalService",
targetNamespace="http://examples.org/")
@WLHttpTransport(contextPath="conv",
serviceUri="ConversationalService",
portName="ConversationalServicePort")
/**
 * 会話形式の Web サービス
 */
public class ConversationalServiceImpl implements Serializable {
  @Context
private JwsContext ctx;
public String status = "undefined";
  @WebMethod
@Conversation (Conversation.Phase.START)
public String start() {
    ServiceHandle handle = ctx.getService();
String convID = handle.getConversationID();
    status = "start";
return "Starting conversation, with ID " + convID + " and status equal to " + status;
  }
  @WebMethod
@Conversation (Conversation.Phase.CONTINUE)
public String middle(String message) {
    status = "middle";
return "Middle of conversation; the message is: " + message + " and status is " + status;
  }
  @WebMethod
@Conversation (Conversation.Phase.FINISH)
public String finish(String message ) {
    status = "finish";
return "End of conversation; the message is: " + message + " and status is " + status;
  }
}

会話形式の Web サービスを実装している JWS ファイルをプログラミングする際には、以下のガイドラインに従います。ガイドラインのコード例は、上述のサンプルでは太字で示されています。

会話形式の Web サービスを呼び出す JWS ファイルに関するプログラミングのガイドライン

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

package examples.webservices.conversation;
import weblogic.jws.WLHttpTransport;
import weblogic.jws.ServiceClient;
import weblogic.wsee.conversation.ConversationUtils;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.xml.rpc.Stub;
import examples.webservices.conversation.ConversationalPortType;
import java.rmi.RemoteException;
@WebService(name="ConversationalClientPortType",
serviceName="ConversationalClientService",
targetNamespace="http://examples.org/")
@WLHttpTransport(contextPath="convClient",
serviceUri="ConversationalClient",
portName="ConversationalClientPort")
/**
 * ConversationalService と会話を行うクライアント
 */
public class ConversationalClientImpl {
  @ServiceClient(
wsdlLocation="http://localhost:7001/conv/ConversationalService?WSDL",
serviceName="ConversationalService",
portName="ConversationalServicePort")
  private ConversationalPortType port;
  @WebMethod
public void runConversation(String message) {
    try {
      // 開始オペレーションを呼び出す
String result = port.start();
System.out.println("start method executed.");
System.out.println("The message is: " + result);
      // 続行オペレーションを呼び出す
result = port.middle(message );
System.out.println("middle method executed.");
System.out.println("The message is: " + result);
      // 終了オペレーションを呼び出す
result = port.finish(message );
System.out.println("finish method executed.");
System.out.println("The message is: " + result);
ConversationUtils.renewStub((Stub)port);
    }
catch (RemoteException e) {
e.printStackTrace();
}
  }
}

会話形式の Web サービスを呼び出す JWS ファイルをプログラミングする際には、以下のガイドラインに従います。ガイドラインのコード例は、上述のサンプル内では太字で示されています。

警告 : 会話形式の Web サービスを呼び出すクライアント Web サービスは、必ずしも会話形式にする必要はありません。ただし、クライアントが会話形式でない場合は、このクライアントの複数のインスタンスが同じ会話形式の Web サービス スタブにアクセスする危険性があり、保存されている対話状態が破損するおそれがあります。この危険性があると判断した場合は、クライアント Web サービスも会話形式になるように指定してください。

ConversationUtils ユーティリティ クラス

WebLogic Server には、会話機能で使用するユーティリティ クラスが用意されています。このクラスを使用すると、会話 ID の取得や設定、コンフィグレーション オプションの設定、といった一般的なタスクを実行できます。これらのタスクには、会話形式の Web サービス内で実行するものと、会話形式の Web サービスを呼び出すクライアント内で実行するものがあります。このクラスの使用例については、「会話形式の Web サービスを呼び出す JWS ファイルに関するプログラミングのガイドライン」を参照してください。

詳細については、weblogic.wsee.conversation.ConversationUtils を参照してください。

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

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

<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
  <target name="build-clientService">
    <jwsc
enableAsyncService="true"
srcdir="src"
destdir="${clientService-ear-dir}" >
        <jws file="examples/webservices/conversation/ConversationalClientImpl.java" >
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/conv/ConversationalService?WSDL"
packageName="examples.webservices.conversation"/>
        </jws>
    </jwsc>
  </target>

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

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

会話形式の Web サービスを呼び出すためのスタンドアロン Java クライアントの更新

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

package examples.webservices.conv_standalone.client;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.Stub;
import weblogic.wsee.jaxrpc.WLStub;
/**
 * ConversationalService を呼び出し、これと会話するスタンドアロン クライアント
 */
public class Main {
  public static void main(String[] args)
throws ServiceException, RemoteException{
      ConversationalService service = new ConversationalService_Impl(args[0] + "?WSDL");
ConversationalPortType port = service.getConversationalServicePort();
      // スタブ上のプロパティを設定して、クライアントが高度な機能を使用する Web 
      // サービスを呼び出していることを指定する。このプロパティは、クライアントが
      // WebLogic Server インスタンスで実行されている場合には自動的に設定される
      Stub stub = (Stub)port;
stub._setProperty(WLStub.COMPLEX, "true");
      // 開始オペレーションを呼び出して会話を開始する
String result = port.start();
System.out.println("start method executed.");
System.out.println("The message is: " + result);
      // 続行オペレーションを呼び出す
result = port.middle("middle" );
System.out.println("middle method executed.");
System.out.println("The message is: " + result);
      // 終了オペレーションを呼び出す
result = port.finish("finish" );
System.out.println("finish method executed.");
System.out.println("The message is: " + result);
  }
}

会話形式の Web サービスを呼び出すスタンドアロン Java クライアントをプログラミングする際には、以下のガイドラインに従います。ガイドラインのコード例は、上述のサンプルでは太字で示されています。

会話形式の Web サービスを再デプロイする際にクライアント側で考慮すべき事項

WebLogic Server では、プロダクションの再デプロイメントがサポートされています。つまり、会話形式の WebLogic Web サービスの更新後の新しいバージョンを、同じ Web サービスの古いバージョンと並行してデプロイできます。

WebLogic Server では、新しいクライアントのリクエストのみが新しいバージョンに転送されるように、クライアント接続が自動的に管理されます。再デプロイメント時にすでに Web サービスに接続していたクライアントは、作業が完了するまで古いバージョンのサービスを使用し続けます。作業が完了した時点で、自動的に古い Web サービスが廃止されます。クライアントが会話形式の Web サービスに接続されている場合は、既存の会話がクライアントによって明示的に終了されるか、またはタイムアウトになったときに、そのクライアントの作業が完了したと見なされます。

プロダクションの再デプロイメントと Web サービス クライアントの詳細については、「Web サービスを再デプロイする際にクライアント側で考慮すべき事項」を参照してください。

 


バッファ付き Web サービスの作成

バッファ付きオペレーションがクライアントによって呼び出されると、メソッド オペレーションは JMS キューに渡され、WebLogic Server は非同期にそれを処理します。Web サービスの信頼性のあるメッセージングの場合と同様に、メソッド呼び出しがまだキューに入っているときに WebLogic Server が停止しても、再起動すればすぐに処理が行われます。バッファ付き Web サービスを呼び出す際に、クライアントが呼び出しからの応答を待機しないので、クライアントの実行は続行可能です。

バッファ付き Web サービスの作成 : 主な手順

以下の手順では、バッファ付き Web サービスと、そのバッファ付き Web サービスのオペレーションを呼び出すクライアント Web サービスを作成する方法を説明しています。この手順では、2 つの Web サービスを実装する JWS ファイルをゼロから作成する方法を示しています。既存の JWS ファイルを更新する場合は、この手順をガイドとして利用してください。この手順ではまた、バッファ付き Web サービスをホストする WebLogic Server インスタンスをコンフィグレーションする方法も示しています。

注意 : 非同期の要求と応答機能を一緒に使用しているのでなければ、別の Web サービスからバッファ付き Web サービスを呼び出す必要はありません。これは、スタンドアロン Java アプリケーションからも呼び出すことができます。

Ant ベースの開発環境を設定済みであり、かつ jwsc Ant タスクを実行して、生成されたバッファ付き Web サービスをデプロイするためのターゲットを追加できる、作業用の build.xml ファイルがあることが前提となっています。さらに、バッファ付き Web サービスを呼び出すクライアント Web サービスをホストする、WebLogic Server インスタンスを同様に設定してあることも前提となっています。詳細については以下を参照してください。

  1. バッファ付き Web サービスをホストする WebLogic Server インスタンスをコンフィグレーションします。
  2. バッファ付き Web サービスのホスト WebLogic Server インスタンスのコンフィグレーション」を参照してください。

  3. バッファ付き Web サービスを実装する、新しい JWS ファイルを作成するか、既存の JWS ファイルを更新します。
  4. バッファ付き JWS ファイルに関するプログラミングのガイドライン」を参照してください。

  5. JWS ファイルをバッファ付き Web サービスにコンパイルする、jwsc Ant タスクへの呼び出しを含むよう、build.xml ファイルを更新します。
  6. <jwsc
    srcdir="src"
    destdir="${service-ear-dir}" >
    <jws
    file="examples/webservices/async_buffered/AsyncBufferedImpl.java"
    />
    </jwsc>

    jwsc タスクの使用に関する全般的な情報については、「jwsc WebLogic Web サービス Ant タスクの実行」を参照してください。

  7. 適切な対象を呼び出して WebLogic Server に Web サービスをデプロイすることにより、送り先 JWS ファイルを再コンパイルします。次に例を示します。
  8. prompt> ant build-mainService deploy-mainService
  9. バッファ付き Web サービスを呼び出すクライアント Web サービスを実装する新しい JWS ファイルを作成するか、既存の JWS ファイルを更新します。
  10. バッファ付き Web サービスを呼び出す JWS ファイルのプログラミング」を参照してください。

  11. クライアント Web サービスをビルドする build.xml ファイルを更新します。
  12. バッファ付き Web サービスのクライアント用 build.xml ファイルの更新」を参照してください。

  13. 適切な対象を呼び出し、その後クライアント WebLogic Server に Web サービスを再デプロイすることにより、クライアント JWS ファイルを再コンパイルします。次に例を示します。
  14. prompt> ant build-clientService deploy-clientService

バッファ付き Web サービスのホスト WebLogic Server インスタンスのコンフィグレーション

バッファ付き Web サービスのデプロイ先となる WebLogic Server インスタンスをコンフィグレーションする際には、Web サービスのランタイムで内部的に使用される、JMS サーバやモジュールなどの JMS リソースがコンフィグレーションされます。

これらのリソースは手作業でもコンフィグレーションできますが、コンフィグレーション ウィザードで、Web サービス固有の拡張テンプレートを使用して WebLogic Server ドメインを拡張することもできます。コンフィグレーション ウィザードを使用すると、必要なコンフィグレーション手順を大幅に簡略化できます。詳細については、「Web サービス機能用のドメイン コンフィグレーション」を参照してください。

リソースを手作業でコンフィグレーションしたい場合は、次に示す高度な手順に従ってください。各タスクの実行方法の詳細については、リンクが示されている Administration Console オンライン ヘルプのトピックを参照してください。

  1. バッファ付き Web サービスをホストする WebLogic Server インスタンスが格納されたドメインの Administration Console をブラウザで起動します。
  2. Administration Console を起動する URL に関する手順については、「Administration Console の起動」を参照してください。

  3. JMS サーバを作成します。新規作成しない場合は、既存のものを使用できます。
  4. JMS サーバの作成」を参照してください。

  5. JMS キューが格納された JMS モジュールを作成します。JMS キューを、1 つ前の手順で作成した JMS サーバに対象指定します。必ず、この JMS キューがローカルであることを指定してください。通常は、ローカル JNDI 名を設定することで指定できます。
  6. バッファ付き Web サービスで、デフォルト Web サービスのキューを使用する場合は、JMS キューの JNDI 名を weblogic.wsee.DefaultQueue に設定します。そうせずに、別の JNDI 名を使用する場合は、必ず JWS ファイル内で @BufferQueue アノテーションを使って、この JNDI 名をバッファ付き Web サービスに対して指定します。「バッファ付き JWS ファイルに関するプログラミングのガイドライン」を参照してください。

    バッファ付き Web サービスの機能をクラスタ内で使用している場合は、分散キューではなく、ローカル キューを作成する必要があります。加えて、このキューを明示的にクラスタ内の各サーバに割り当てる必要があります。

    JMS システム モジュールの作成」および「システム モジュールのキューの作成」を参照してください。

バッファ付き JWS ファイルに関するプログラミングのガイドライン

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

package examples.webservices.buffered;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.Oneway;
import weblogic.jws.WLHttpTransport;
import weblogic.jws.MessageBuffer;
import weblogic.jws.BufferQueue;
@WebService(name="BufferedPortType",
serviceName="BufferedService",
targetNamespace="http://example.org")
@WLHttpTransport(contextPath="buffered",
serviceUri="BufferedService",
portName="BufferedPort")
// デフォルトではなく特定の JMS キューを指定するアノテーション
@BufferQueue(name="my.jms.queue")
/**
 * 簡単なバッファ付き Web サービス
 */
public class BufferedImpl {
  @WebMethod()
@MessageBuffer(retryCount=10, retryDelay="10 seconds")
@Oneway()
  public void sayHelloNoReturn(String message) {
System.out.println("sayHelloNoReturn: " + message);
  }
}

バッファ付き Web サービスを実装している JWS ファイルをプログラミングする際には、以下のガイドラインに従います。ガイドラインのコード例は、上述のサンプルでは太字で示されています。

バッファ付き Web サービスを呼び出す JWS ファイルのプログラミング

バッファ付き Web サービスは、スタンドアロン Java アプリケーション (非同期の要求と応答を使用していない場合) と、別の Web サービスの、双方から呼び出せます。ただし、他の WebLogic Web サービスの非同期機能とは異なり、クライアント Web サービスにおいて @ServiceClient JWS アノテーションは使用せず、その他のサービスと同じように呼び出します。詳細については、「別の Web サービスからの Web サービスの呼び出し」を参照してください。

次のサンプル JWS ファイルでは、BufferedService Web サービスの sayHelloNoReturn オペレーションを呼び出す方法を示します。

package examples.webservices.buffered;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import javax.jws.WebService;
import javax.jws.WebMethod;
import weblogic.jws.WLHttpTransport;
import examples.webservices.buffered.BufferedPortType;
import examples.webservices.buffered.BufferedService_Impl;
import examples.webservices.buffered.BufferedService;
@WebService(name="BufferedClientPortType",
serviceName="BufferedClientService",
targetNamespace="http://examples.org")
@WLHttpTransport(contextPath="bufferedClient",
serviceUri="BufferedClientService",
portName="BufferedClientPort")
public class BufferedClientImpl {
  @WebMethod()
public String callBufferedService(String input, String serviceUrl)
throws RemoteException {
    try {
    BufferedService service = new BufferedService_Impl(serviceUrl + "?WSDL");
BufferedPortType port = service.getBufferedPort();
    // BufferedService の sayHelloNoReturn() オペレーションを呼び出す
    port.sayHelloNoReturn(input);
    return "Invoke went okay!";
    } catch (ServiceException se) {
         System.out.println("ServiceExcpetion thrown");
throw new RuntimeException(se);
      }
}
}

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

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

<taskdef name="jwsc"
classname="weblogic.wsee.tools.anttasks.JwscTask" />
<target name="build-clientService">
    <jwsc
enableAsyncService="true"
srcdir="src"
destdir="${clientService-ear-dir}" >
        <jws file="examples/webservices/buffered/BufferedClientImpl.java">
<clientgen
wsdl="http://${wls.hostname}:${wls.port}/buffered/BufferedService?WSDL"
packageName="examples.webservices.buffered"/>
        </jws>
    </jwsc>
  </target>

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

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

 


非同期機能の併用

ここまでの各節では、WebLogic Web サービスの非同期機能 (Web サービスの信頼性のあるメッセージング、会話、非同期の要求と応答、およびバッファリング) を単独で使用する方法を説明してきました。しかし通常、Web サービスではこれらの機能を、併用しています。例については、「信頼性のある会話形式の Web サービスを実装する JWS ファイルの例」および「信頼性のある会話形式の Web サービスを非同期で呼び出すクライアント Web サービスの例」を参照してください。

併用すると、個々の機能についての節で説明した制限事項の一部が適用されなくなったり、場合によっては追加の制限事項が適用されたりします。

信頼性のある会話形式の Web サービスを実装する JWS ファイルの例

次のサンプルの JWS ファイルでは、信頼性があり、かつ会話形式でもある Web サービスを実装しています。

package examples.webservices.async_mega;
import java.io.Serializable;
import weblogic.jws.WLHttpTransport;
import weblogic.jws.Conversation;
import weblogic.jws.Policy;
import javax.jws.WebService;
import javax.jws.WebMethod;
@WebService(name="AsyncMegaPortType",
serviceName="AsyncMegaService",
targetNamespace="http://examples.org/")
@Policy(uri="AsyncReliableConversationPolicy.xml",
attachToWsdl=true)
@WLHttpTransport(contextPath="asyncMega",
serviceUri="AsyncMegaService",
portName="AsyncMegaServicePort")
/**
 * 信頼性があり、かつ会話形式でもある Web サービス
 */
public class AsyncMegaServiceImpl implements Serializable {
  @WebMethod
@Conversation (Conversation.Phase.START)
public String start() {
return "Starting conversation";
}
  @WebMethod
@Conversation (Conversation.Phase.CONTINUE)
public String middle(String message) {
return "Middle of conversation; the message is: " + message;
}
  @WebMethod
@Conversation (Conversation.Phase.FINISH)
public String finish(String message ) {
return "End of conversation; the message is: " + message;
}
}

信頼性のある会話形式の Web サービスを非同期で呼び出すクライアント Web サービスの例

次の JWS ファイルでは、「信頼性のある会話形式の Web サービスを実装する JWS ファイルの例」に記載の Web サービスにおけるさまざまな会話形式のメソッドを確実に呼び出すクライアント Web サービスの実装方法を示します。クライアント JWS ファイルでは、非同期の要求と応答機能も使用しています。

package examples.webservices.async_mega;
import weblogic.jws.WLHttpTransport;
import weblogic.jws.ServiceClient;
import weblogic.jws.AsyncResponse;
import weblogic.jws.AsyncFailure;
import javax.jws.WebService;
import javax.jws.WebMethod;
import weblogic.wsee.async.AsyncPreCallContext;
import weblogic.wsee.async.AsyncCallContextFactory;
import weblogic.wsee.async.AsyncPostCallContext;
import examples.webservices.async_mega.AsyncMegaPortType;
import examples.webservices.async_mega.AsyncMegaService;
import examples.webservices.async_mega.AsyncMegaService_Impl;
import java.rmi.RemoteException;
@WebService(name="AsyncMegaClientPortType",
serviceName="AsyncMegaClientService",
targetNamespace="http://examples.org/")
@WLHttpTransport(contextPath="asyncMegaClient",
serviceUri="AsyncMegaClient",
portName="AsyncMegaClientServicePort")
/**
 * AsyncMegaService との間で信頼性を伴い非同期に会話するクライアント
 * Web サービス
 */
public class AsyncMegaClientImpl {
  @ServiceClient(
wsdlLocation="http://localhost:7001/asyncMega/AsyncMegaService?WSDL",
serviceName="AsyncMegaService",
portName="AsyncMegaServicePort")
  private AsyncMegaPortType port;
  @WebMethod
public void runAsyncReliableConversation(String message) {
    AsyncPreCallContext apc = AsyncCallContextFactory.getAsyncPreCallContext();
apc.setProperty("message", message);
    try {
port.startAsync(apc);
System.out.println("start method executed.");
      port.middleAsync(apc, message );
System.out.println("middle method executed.");
      port.finishAsync(apc, message );
System.out.println("finish method executed.");
    }
catch (RemoteException e) {
e.printStackTrace();
}
  }
  @AsyncResponse(target="port", operation="start")
public void onStartAsyncResponse(AsyncPostCallContext apc, String message) {
System.out.println("-------------------");
System.out.println("Got message " + message );
System.out.println("-------------------");
}
  @AsyncResponse(target="port", operation="middle")
public void onMiddleAsyncResponse(AsyncPostCallContext apc, String message) {
System.out.println("-------------------");
System.out.println("Got message " + message );
System.out.println("-------------------");
}
  @AsyncResponse(target="port", operation="finish")
public void onFinishAsyncResponse(AsyncPostCallContext apc, String message) {
System.out.println("-------------------");
System.out.println("Got message " + message );
System.out.println("-------------------");
}
  @AsyncFailure(target="port", operation="start")
public void onStartAsyncFailure(AsyncPostCallContext apc, Throwable e) {
System.out.println("-------------------");
e.printStackTrace();
System.out.println("-------------------");
}
  @AsyncFailure(target="port", operation="middle")
public void onMiddleAsyncFailure(AsyncPostCallContext apc, Throwable e) {
System.out.println("-------------------");
e.printStackTrace();
System.out.println("-------------------");
}
  @AsyncFailure(target="port", operation="finish")
public void onFinishAsyncFailure(AsyncPostCallContext apc, Throwable e) {
System.out.println("-------------------");
e.printStackTrace();
System.out.println("-------------------");
  }
}

 


信頼性のあるメッセージングまたは非同期の要求応答とプロキシ サーバの使用

信頼性のある Web サービスを呼び出すクライアント アプリケーション、または非同期の要求応答を使用するクライアント アプリケーションでは、オペレーションを直接呼び出さず、プロキシ サーバを使用する場合があります。プロキシを使用する理由としては、ファイアウォールの存在や、呼び出された Web サービスのクラスタへのデプロイメントなどがあります。

この場合、呼び出された Web サービスをホストする WebLogic Server インスタンスは、プロキシ サーバのアドレスとポートでコンフィグレーションされる必要があります。Web サービスがクラスタにデプロイされている場合は、そのクラスタ内のすべてのサーバをコンフィグレーションすることが必要です。

各サーバ インスタンスについて、以下の手順を実行します。

  1. Web サービスの呼び出しに使用するプロトコル用のネットワーク チャネルを作成します。ネットワーク チャネルの名前は、weblogic-wsee-proxy-channel-XXX とする必要があります。XXX は、プロトコルを表します。たとえば、HTTPS 用のネットワーク チャネルを作成する場合、weblogic-wsee-proxy-channel-https という名前にします。
  2. ネットワーク チャネルの作成に関する全般的な情報については、Administration Console オンライン ヘルプの「カスタム ネットワーク チャネルのコンフィグレーション」を参照してください。

  3. [外部リスン アドレス] および [外部リスン ポート] フィールドを、それぞれプロキシ サーバのアドレスおよびポートで更新して、ネットワーク チャネルをコンフィグレーションします。

  ページの先頭       前  次