Oracle® Fusion Middleware Oracle WebLogic Server JAX-RPC Webサービスの高度な機能のプログラミング 11g リリース1(10.3.5) B61634-03 |
|
前 |
次 |
次の項では、バッファ付きWebサービスの作成方法について説明します。
バッファ付き操作がクライアントによって呼び出されると、メソッド操作はJMSキューに渡され、WebLogic Serverは非同期にそれを処理します。Webサービスの信頼性のあるメッセージングの場合と同様に、メソッド呼出しがまだキューに入っているときにWebLogic Serverが停止しても、再起動すればすぐに処理が行われます。バッファ付きWebサービスを呼び出す際に、クライアントが呼出しからのレスポンスを待機しないので、クライアントの実行は続行可能です。
次の手順では、バッファ付きWebサービスと、そのバッファ付きWebサービス操作を呼び出すクライアントWebサービスを作成する方法を説明しています。この手順では、2つのWebサービスを実装するJWSファイルをゼロから作成する方法を示しています。既存のJWSファイルを更新する場合は、この手順をガイドとして利用してください。この手順ではまた、バッファ付きWebサービスをホストするWebLogic Serverインスタンスを構成する方法も示しています。
注意: 非同期のリクエストとレスポンス機能を一緒に使用しているのでなければ、別のWebサービスからバッファ付きWebサービスを呼び出す必要はありません。これは、スタンドアロンJavaアプリケーションからも呼び出すことができます。 |
Antベースの開発環境を設定済であり、かつjwsc
Antタスクを実行して生成されたバッファ付きWebサービスをデプロイするためのターゲットを追加できる、作業用のbuild.xml
ファイルがあることが前提となっています。さらに、バッファ付きWebサービスを呼び出すクライアントWebサービスをホストする、WebLogic Serverインスタンスを同様に設定してあることも前提となっています。詳細は、『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』を参照してください。
使用例とサンプル
WebLogic Webサービスの開発
JWSファイルのプログラミング
Webサービスの呼出し
表5-1 バッファ付きWebサービスの作成手順
# |
手順 | 説明 |
---|---|---|
1 |
バッファ付きWebサービスをホストするWebLogic Serverインスタンスを構成します。 |
|
2 |
バッファ付きWebサービスを実装する、新しいJWSファイルを作成するか、既存のJWSファイルを更新します。 |
使い慣れたIDEまたはテキスト・エディタを使用します。「バッファ付きJWSファイルに関するプログラミングのガイドライン」を参照してください。 |
3 |
|
例: <jwsc srcdir="src" destdir="${service-ear-dir}" > <jws file="examples/webservices/async_buffered/AsyncBufferedImpl.java" /> </jwsc>
|
4 |
適切なターゲットを呼び出してJWSファイルを再コンパイルしてから、WebLogic ServerにWebサービスを再デプロイします。 |
例: prompt> ant build-clientService deploy-clientService デプロイメントの詳細は、『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のWebLogic Webサービスのデプロイとアンデプロイに関する項を参照してください。 |
5 |
バッファ付きWebサービスを呼び出すクライアントWebサービスを実装する、新しいJWSファイルを作成するか、既存のJWSファイルを更新します。 |
「バッファ付きWebサービスを呼び出すJWSファイルのプログラミング」を参照してください。 |
6 |
クライアントWebサービスをビルドする |
「バッファ付きWebサービスのクライアント用build.xmlファイルの更新」を参照してください。 |
7 |
適切なターゲットを呼び出してクライアントJWSファイルを再コンパイルしてから、クライアントWebLogic ServerにWebサービスを再デプロイします。 |
例: prompt> ant build-clientService deploy-clientService デプロイメントの詳細は、『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のWebLogic Webサービスのデプロイとアンデプロイに関する項を参照してください。 |
バッファ付きWebサービスのデプロイ先となるWebLogic Serverインスタンスを構成する際には、Webサービスのランタイムで内部的に使用される、JMSサーバーやモジュールなどのJMSリソースを構成します。
これらのリソースは手作業でも構成できますが、構成ウィザードで、Webサービス固有の拡張テンプレートを使用してWebLogic Serverドメインを拡張することもできます。構成ウィザードを使用すると、必要な構成手順を大幅に簡略化できます。詳細は、『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のWebサービス機能用のドメイン構成に関する項を参照してください。
注意: または、WLSTを使用してリソースを構成することもできます。WLSTを使用してドメインを拡張する方法については、『Oracle WebLogic Scripting Tool』の既存ドメインの構成に関する項を参照してください。Webサービス・リソースを含まないドメインは、Webサービスと関連のないシナリオや、非同期のリクエストおよびレスポンスを呼び出さないWebサービスのシナリオであれば、適切に起動して実行されます。ただし、サーバー・ログには、非同期リソースが構成されていないことと、Webサービス用の非同期レスポンス・サービスが完全にデプロイされていないことを示すINFOメッセージが表示されます。 |
リソースを手作業で構成する場合、以下の手順を実行します。
表5-2 バッファ付きWebサービスのホストWebLogic Serverインスタンスを手作業で構成する手順
# |
手順 | 説明 |
---|---|---|
1 |
ホストWebLogic Serverインスタンスが格納されたドメインの管理コンソールを起動します。 |
ブラウザで管理コンソールを起動するには、次のURLを入力します。 http://host:port/console 説明:
『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』の管理コンソールの起動に関する項を参照してください。 |
3 |
JMSサーバーを作成します。 |
JMSサーバーを作成します。JMSサーバーがすでに存在する場合は、新しいJMSサーバーを作成せずにそれを使用できます。 Oracle WebLogic Server管理コンソール・ヘルプのJMSサーバーの作成に関する項を参照してください。 |
4 |
JMSモジュールを作成し、キューを定義します。 |
JMSモジュールを作成し、その中にJMSキューを定義します。JMSモジュールがすでに存在する場合は、新しいJMSモジュールを作成せずにそれを使用することもできます。JMSキューを、1つ前の手順で作成したJMSサーバーにターゲット指定します。このJMSキューがローカルであることを必ず指定してください(通常は、ローカルJNDI名の設定により指定できます)。Oracle WebLogic Server管理コンソール・ヘルプのJMSシステム・モジュールの作成に関する項とシステム・モジュールのキューの作成に関する項を参照してください。 バッファ付きWebサービスで、デフォルトWebサービスのキューを使用する場合は、JMSキューのJNDI名を クラスタリングの考慮事項: クラスタ内でWebサービスのバッファ機能を使用する場合は、次の作業を行う必要があります。
|
4 |
必要に応じて、現在のドメイン環境をチューニングする(オプション)。 |
『WebLogic Serverパフォーマンス・チューニング・ガイド』の「Webサービスのパフォーマンスを向上させるために負荷が高いシステムのチューニング」を参照してください。 |
次のサンプルでは、バッファ付き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") // Annotation to specify a specific JMS queue rather than the default @BufferQueue(name="my.jms.queue") /** * Simple buffered Web Service. */ 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アノテーションをインポートします。
import javax.jws.Oneway; import weblogic.jws.MessageBuffer; import weblogic.jws.BufferQueue;
どのJWSアノテーションが必要かについては、以下の箇条書きを参照してください。
必要に応じて、クラス・レベルの@BufferQueue
JWSアノテーションを使用し、バッファ付きの呼出しを処理する際にWebLogic Serverによって内部使用されるJMSキューのJNDI名を指定します。例:次のようになります。
@BufferQueue(name="my.jms.queue")
このJWSアノテーションを指定しなかった場合、WebLogic Serverは、デフォルトWebサービスJMSキュー(weblogic.wsee.DefaultQueue
)を使用します。
デフォルトのJMSキューと、このアノテーションで指定されたキューの双方を作成してからでなければ、バッファ付きの操作を正常に呼び出すことはできません。詳細については、「バッファ付きWebサービスのホストWebLogic Serverインスタンスの構成」を参照してください。
@MessageBuffer
JWSアノテーションを使用し、バッファ付きWebサービス操作を指定します。アノテーションには、次の2つのオプション属性があります。
retryCount
: WebLogic ServerによるJMSキューからWebサービス実装へのメッセージ配信試行回数(デフォルトでは3)。
retryDelay
:サーバーが待機すべき再試行間隔(デフォルトでは5分)。
例:
@MessageBuffer(retryCount=10, retryDelay="10 seconds")
このアノテーションをクラス・レベルで使用すると、すべての操作をバッファ付きにすることを指定でき、メソッド・レベルで指定すると、どの操作をバッファ付きにするかを選択できます。
バッファ付きWebサービス操作を同期的に呼び出す(すなわち、非同期のリクエストとレスポンス機能を使用しない)場合は、実装メソッドに@Oneway
アノテーションを付けて、そのメソッドが一方向のものであることを指定する必要があります。つまり、メソッドは値を戻すことができず、明示的にvoid
を戻すことになります。例:
@Oneway() public void sayHelloNoReturn(String message) {
反対に、メソッドに@Oneway
アノテーションが付いていなければ、非同期のリクエストとレスポンス機能を使用して呼び出す必要があります。操作の呼出し方法がわからない場合は、同期と非同期の2種類の操作を作成することを検討してください。
第2章「非同期のリクエストとレスポンスを使用したWebサービスの呼出し」と第6章「非同期機能の併用」を参照してください。
バッファ付きWebサービスは、スタンドアロンJavaアプリケーション(非同期のリクエストとレスポンスを使用していない場合)と別のWebサービスの双方から呼び出せます。ただし、他のWebLogic Webサービスの非同期機能とは異なり、クライアントWebサービスにおいて@ServiceClient
JWSアノテーションは使用せず、その他のサービスと同じように呼び出します。詳細は、『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』の別の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(); // Invoke the sayHelloNoReturn() operation of BufferedService port.sayHelloNoReturn(input); return "Invoke went okay!"; } catch (ServiceException se) { System.out.println("ServiceExcpetion thrown"); throw new RuntimeException(se); } } }
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タスクでは、これらのスタブが生成されたWARファイルに自動的にパッケージ化されるため、即座にクライアントWebサービスからアクセスできるようになります。このようにするのは、生成されたクラスの1つをBufferedClientImpl
JWSファイルでインポートして使用するためです。