Oracle® Fusion Middleware Oracle WebLogic Server JAX-RPC を使用した Web サービスの高度な機能のプログラミング 11g リリース 1 (10.3.1) B55544-01 |
|
戻る |
次へ |
以下の節では、バッファ付き 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 Fusion Middleware Oracle WebLogic Server JAX-RPC を使用した Web サービス入門』を参照してください。
表 5-1 バッファ付き Web サービスの作成手順
# |
手順 | 説明 |
---|---|---|
1 |
バッファ付き Web サービスをホストする WebLogic Server インスタンスをコンフィグレーションする。 |
|
2 |
バッファ付き Web サービスを実装する、新しい JWS ファイルを作成するか、既存の JWS ファイルを更新する。 |
使い慣れた IDE またはテキスト エディタを使用する。「バッファ付き JWS ファイルに関するプログラミングのガイドライン」を参照。 |
3 |
JWS ファイルをバッファ付き Web サービスにコンパイルする、 |
例 : <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 Fusion Middleware Oracle WebLogic Server JAX-RPC を使用した Web サービス入門』の「WebLogic Web サービスのデプロイとアンデプロイ」を参照。 |
5 |
バッファ付き Web サービスを呼び出すクライアント Web サービスを実装する新しい JWS ファイルを作成するか、既存の JWS ファイルを更新する。 |
|
6 |
クライアント Web サービスをビルドする |
|
7 |
適切な対象を呼び出してクライアント JWS ファイルを再コンパイルしてから、クライアント WebLogic Server に Web サービスを再デプロイする。 |
例 : prompt> ant build-clientService deploy-clientService デプロイメントの詳細については、『Oracle Fusion Middleware Oracle WebLogic Server JAX-RPC を使用した Web サービス入門』の「WebLogic Web サービスのデプロイとアンデプロイ」を参照。 |
バッファ付き Web サービスのデプロイ先となる WebLogic Server インスタンスをコンフィグレーションする際には、Web サービスのランタイムで内部的に使用される、JMS サーバやモジュールなどの JMS リソースがコンフィグレーションされます。
これらのリソースは手作業でもコンフィグレーションできますが、コンフィグレーション ウィザードで、Web サービス固有の拡張テンプレートを使用して WebLogic Server ドメインを拡張することもできます。コンフィグレーション ウィザードを使用すると、必要なコンフィグレーション手順を大幅に簡略化できます。詳細については、『Oracle Fusion Middleware Oracle WebLogic Server JAX-RPC を使用した Web サービス入門』の「Web サービス機能用のドメイン コンフィグレーション」を参照してください。
注意 : または、WLST を使用してリソースをコンフィグレーションすることもできます。WLST を使用してドメインを拡張する方法の詳細については、『Oracle Fusion Middleware Oracle WebLogic Scripting Tool ガイド』の「既存ドメインのコンフィグレーション」を参照してください。 |
リソースを手作業でコンフィグレーションする場合、以下の手順を実行します。
表 5-2 バッファ付き Web サービスのホスト WebLogic Server インスタンスを手作業でコンフィグレーションする手順
# |
手順 | 説明 |
---|---|---|
1 |
ホスト WebLogic Server インスタンスが格納されたドメインの Administration Console を起動する。 |
ブラウザで Administration Console を起動するには、次の URL を入力する。 http://host:port/console 各要素の説明は次のとおりである。
『Oracle Fusion Middleware Oracle WebLogic Server JAX-RPC を使用した Web サービス入門』の「Administration Console の起動」を参照。 |
3 |
JMS サーバを作成する。 |
JMS サーバを作成する。JMS サーバがすでに存在する場合は、新しい JMS サーバを作成せずにそれを使用できる。 『Oracle Fusion Middleware Oracle WebLogic Server Administration Console ヘルプ』の「JMS サーバの作成」を参照。 |
4 |
JMS モジュールを作成し、キューを定義する。 |
JMS モジュールを作成し、その中で JMS キューを定義する。JMS モジュールがすでに存在する場合は、新しい JMS モジュールを作成せずにそれを使用することができる。JMS キューを、1 つ前の手順で作成した JMS サーバに対象指定する。この JMS キューがローカルであることを指定する必要がある。通常は、ローカル JNDI 名の設定により指定できる。『Oracle Fusion Middleware Oracle WebLogic Server Administration Console ヘルプ』の「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") // デフォルトではなく特定の 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 アノテーションをインポートする。
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 種類のオペレーションを作成することを検討してください。
「非同期のリクエストと応答を使用した Web サービスの呼び出し」と「非同期機能の併用」を参照してください。
バッファ付き Web サービスは、スタンドアロン Java アプリケーション (非同期の要求と応答を使用していない場合) と、別の Web サービスの、双方から呼び出せます。ただし、他の WebLogic Web サービスの非同期機能とは異なり、クライアント Web サービスにおいて @ServiceClient
JWS アノテーションは使用せず、その他のサービスと同じように呼び出します。詳細については、『Oracle Fusion Middleware 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(); // BufferedService の sayHelloNoReturn() オペレーションを呼び出す 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 ファイルでインポートして使用するためです。