Oracle® Fusion Middleware Oracle WebLogic Server JAX-RPC Webサービスの高度な機能のプログラミング 11g リリース1 (10.3.6) B61634-05 |
|
![]() 前 |
![]() 次 |
この章では、非同期リクエスト-レスポンスを使用するWebLogic Java API for XML-based RPC (JAX-RPC) Webサービスで、JMSトランスポートを接続プロトコルとして使用する方法について説明します。
この章では、以下のトピックについて説明します。
通常、クライアント・アプリケーションからWebLogic Webサービスを呼び出すときは、接続プロトコルとしてHTTP/Sが使用されます。しかし、クライアント・アプリケーションがトランスポートとしてJMSを使用するようにWebLogic Webサービスを構成することもできます。
JMSトランスポートを使用すると、信頼性、スケーラビリティ、サービス品質が向上します。Webサービスの信頼性のあるメッセージングの場合と同様に、メソッド呼出しがまだキューに入っているときにWebLogic Serverが停止しても、再起動すればすぐに処理が行われます。クライアントは、Webサービスを呼び出す際に呼出しからのレスポンスを待機しないため、クライアントの実行は続行可能です。ただし、JMSトランスポートを使用する場合は、HTTP/Sより若干オーバーヘッドが大きくなり、プログラムが複雑になります。
トランスポートを構成するには、後の項で説明するように、JWSアノテーションとjwsc
Antタスクの子要素のどちらかを使用します。接続トランスポートとしてJMSを使用するようにWebLogic Webサービスを構成した場合、Webサービスの生成済WSDLで対応するポートに対して指定されたエンドポイント・アドレスのURLでは、http://
ではなくjms://
が使用されます。JMSエンドポイントのアドレスの例を次に示します。
jms://myHost:7001/transports/JMSTransport?URI=JMSTransportQueue
URLのURI=JMSTransportQueue
セクションでは、JMSトランスポート機能用に構成されたJMSキューを指定しています。HTTPを使用してWebサービスを呼び出すことはできませんが、HTTPを使用してそのWebサービスのWSDLを参照できます。これにより、clientgen
はやはりWebサービスのJAX-RPCスタブを生成できます。
指定する各トランスポートに対し、WebLogic ServerはWSDL内に追加のポートを生成します。このため、Webサービス呼出し時に使用できるトランスポート(JMS、HTTP、またはHTTPS)をクライアント・アプリケーションで選択できるようにするには、適切なJWSアノテーションまたはjwsc
の子要素を使用して、明示的にトランスポートを追加する必要があります。
注意: JMSトランスポートの使用は、WebLogicの付加価値機能です。.NETクライアントなど、WebLogic以外のクライアント・アプリケーションでは、JMSポートを使用してWebサービスを呼び出すことができない場合があります。 |
Javaから開始する際にJMSトランスポートを使用するには、以下の少なくとも1つのタスクを実行する必要があります。
JWSファイルに@WLJmsTransport
アノテーションを追加します。
jwsc
Antタスクに<WLJmsTransport>
子要素を追加します。この設定は、JWSファイルで定義されたトランスポートをオーバーライドします。
注意: JWSファイルのコーディング時にはニーズに最適なトランスポートがわからない場合があるため、トランスポートは、 |
次の手順では、Javaから開始する際に、JMSトランスポートを使用して現在のWebサービスを呼び出すために必要なすべての手順について説明します。
注意: Webサービスを実装する基本的なJWSファイルが作成されており、JMSを使用して呼び出すWebサービスを構成することが前提となっています。また、Antベースの開発環境を設定済であり、かつ |
表8-1 Javaから開始するJMSトランスポートの使用手順
# |
手順 | 説明 |
---|---|---|
1 |
必要なJMSコンポーネント用にWebLogic Serverドメインを構成します。 |
|
2 |
JWSファイルに |
この手順は省略可能です。現在のJWSに 「@WLJmsTransport JWSアノテーションの使用」を参照してください。 |
3 |
|
詳細については、「jwsc Antタスクの<WLJmsTransport>子要素の使用」を参照してください。 |
4 |
|
たとえば、 prompt> ant build-service 『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のjwsc WebLogic WebサービスAntタスクの実行に関する項を参照してください。 |
5 |
WebサービスをWebLogic Serverにデプロイします。 |
『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のWebLogic Webサービスのデプロイとアンデプロイに関する項を参照してください。 |
JMSトランスポートを使用してWebサービスを呼び出すようにクライアント・アプリケーションを更新する方法については、「JMSトランスポートを使用したWebLogic Webサービスの呼出し」を参照してください。
WSDLから開始する際にJMSトランスポートを使用するには、以下の少なくとも1つのタスクを実行する必要があります。
wsdlc
Antタスクを実行する前に、JMSトランスポートを使用するようにWSDLを更新します。
@WLJmsTransport
アノテーションを追加するように、wsdlc
Antタスクによって生成される途中まで作成済みのJWS実装ファイルを更新します。
JWS実装ファイルの作成に使用されるjwsc
Antタスクに<WLJmsTransport>
子要素を追加します。この設定は、JWSファイルで定義されたトランスポートをオーバーライドします。
注意: JWSファイルのコーディング時にはニーズに最適なトランスポートがわからない場合があるため、トランスポートは、 |
次の手順では、WSDLから開始する際に、JMSトランスポートを使用して現在のWebサービスを呼び出すために必要なすべての手順について説明します。
注意: この手順では既存のWSDLファイルがあることを前提としています。 |
表8-2 WSDLから開始するJMSトランスポートの使用手順
# |
手順 | 説明 |
---|---|---|
1 |
必要なJMSコンポーネント用にWebLogic Serverドメインを構成します。 |
|
2 |
JMSトランスポートを使用するようWSDLを更新する(オプション) |
この手順は省略可能です。JMSトランスポートを使用するようWSDLを更新しなかった場合、以下の少なくとも1つの作業を行う必要があります。
「JMSトランスポートを使用するためのWSDLの更新」を参照してください。 |
3 |
WSDLファイルに対して |
たとえば、 prompt> ant generate-from-wsdl 『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のwsdlc WebLogic WebサービスAntタスクの実行に関する項を参照してください。 |
4 |
途中まで作成済みのJWSファイルを更新します。 |
ステップ2で、JMSトランスポートを使用するようにWSDLを更新した場合、JWSファイルには、JMSトランスポートを定義する
|
5 |
|
詳細については、「jwsc Antタスクの<WLJmsTransport>子要素の使用」を参照してください。 |
6 |
JWSファイルに対して |
|
7 |
WebサービスをWebLogic Serverにデプロイします。 |
『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のWebLogic Webサービスのデプロイとアンデプロイに関する項を参照してください。 |
JMSトランスポートを使用してWebサービスを呼び出すようにクライアント・アプリケーションを更新する方法については、「JMSトランスポートを使用したWebLogic Webサービスの呼出し」を参照してください。
JMSトランスポート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メッセージが表示されます。 |
リソースを手作業で構成する場合、以下の手順を実行します。
表8-3 JMSトランスポートWebサービスのホストWebLogic Serverインスタンスを手作業で構成する手順
# |
手順 | 説明 |
---|---|---|
1 |
ホストWebLogic Serverインスタンスが格納されたドメインの管理コンソールを起動します。 |
ブラウザで管理コンソールを起動するには、次のURLを入力します。
ここで
『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システム・モジュールの作成に関する項とシステム・モジュールのキューの作成に関する項を参照してください。 JMSトランスポートWebサービスで、デフォルトWebサービスのキューを使用する場合は、JMSキューのJNDI名を クラスタリングの考慮事項: クラスタ内でWebサービスのJMSトランスポート機能を使用する場合は、次の作業を行う必要があります。
|
JWSファイルをプログラムした時点で、Webサービスの呼出しにクライアント・アプリケーションで(HTTP/Sではなく) JMSトランスポートを使用することが決まっている場合は、@WLJmsTransport
を使用してその呼出しの詳細を指定できます。後のビルド時に、「jwsc Antタスクの<WLJmsTransport>子要素の使用」に従い、jwsc
Antタスクの<WLJmsTransport>
子要素を指定して、JWSファイルで定義されている呼出しをオーバーライドし、さらにJMSトランスポート指定を追加できます。
@WLJmsTransport
アノテーションを使用する際は、これらのガイドラインに従ってください:
JWSファイルに含めることができる@WLJmsTransport
アノテーションは1つのみです。
これより前の部分で構成したJMSキューのJNDI名の指定にはqueue
属性を使用します。デフォルトのWebサービス・キュー(weblogic.wsee.DefaultQueue
)を使用する場合は、queue
属性を指定する必要はありません。
接続ファクトリのJNDI名の指定にはconnectionFactory
属性を使用します。この属性のデフォルト値は、WebLogic ServerインスタンスのデフォルトのJMS接続ファクトリです。
次の例では、@WLJmsTransport
アノテーションを使用する簡単なJWSファイルを示します。関連するコードは太字で示しています。
package examples.webservices.jmstransport; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import weblogic.jws.WLJmsTransport; @WebService(name="JMSTransportPortType", serviceName="JMSTransportService", targetNamespace="http://example.org") @SOAPBinding(style=SOAPBinding.Style.DOCUMENT, use=SOAPBinding.Use.LITERAL, parameterStyle=SOAPBinding.ParameterStyle.WRAPPED) // WebLogic-specific JWS annotation that specifies the context path and // service URI used to build the URI of the Web Service is // "transports/JMSTransport" @WLJmsTransport(contextPath="transports", serviceUri="JMSTransport", queue="JMSTransportQueue", portName="JMSTransportServicePort", connectionFactory="JMSTransportConnectionFactory") /** * This JWS file forms the basis of simple Java-class implemented WebLogic * Web Service with a single operation: sayHello */ public class JMSTransportImpl { @WebMethod() public String sayHello(String message) { System.out.println("sayHello:" + message); return "Here is the message: '" + message + "'"; } }
JMSトランスポートはjwsc
Antタスクの<jws>
要素の<WLJmsTransport>
子要素を使用して、ビルド時にも指定できます。ビルド時にトランスポートを指定する理由としては、次のようなものが挙げられます。
JWSファイルで指定した属性値をオーバーライドする必要があります。
JWSファイルでは別のトランスポートが指定されており、ビルド時に、JMSをトランスポートとして使用すると決定しました。
JWSファイルに@WLXXXTransport
アノテーションが含まれていないため、デフォルトではHTTPトランスポートが使用されていますが、ビルド時にJMSトランスポートを使用してWebサービスを呼び出すと決定しました。
jwsc
Antタスクに対してトランスポートを指定すると、それがJWSファイル内のすべてのトランスポート・アノテーションに優先されます。
次の例では、jwsc
Antタスクに対してトランスポートを指定する方法を示します。
<target name="build-service"> <jwsc srcdir="src" destdir="${ear-dir}"> <jws file="examples/webservices/jmstransport/JMSTransportImpl.java"> <WLJmsTransport contextPath="transports" serviceUri="JMSTransport" portName="JMSTransportServicePort" queue="JMSTransportQueue" connectionFactory="JMSTransportConnectionFactory"/> </jws> </jwsc> </target>
上述の例では、「@WLJmsTransport JWSアノテーションの使用」に示したJWSファイルで指定されたものと同じ値をURLおよびJMSキューに対して指定する方法を示しています。
jwsc
Antタスクの使用方法の詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のjwscに関する項を参照してください。
JMSトランスポートを使用するようにWSDLを更新するには、JMSトランスポート情報を定義する<wsdl:binding>
定義と<wsdl:service>
定義を追加する必要があります。これらの定義は、以下のいずれかの方法で追加できます。
既存のHTTPの<wsdl:binding>
および<wsdl:service>
定義を編集します。
WSDLで複数のトランスポート・オプションを指定するには、既存のHTTPの<wsdl:binding>
および<wsdl:service>
定義をコピーし、JMSトランスポートを使用するように編集します。
どちらの場合でも、JMSトランスポートを使用するように<wsdl:binding>
および<wsdl:service>
定義を以下のように変更する必要があります。
<wsdl:binding>
要素の子要素<soapwsdl:binding>
のtransport
属性をhttp://www.openuri.org/2002/04/soap/jms
に設定します。例:
<binding name="JmsTransportServiceSoapBindingjms" type="tns:JmsTransportPortType">
<soap:binding style="document" transport="http://www.openuri.org/2002/04/soap/jms/"/>
<wsdl:service>
の子要素<soapwsdl:address>
のlocation
属性に、JMS形式のエンドポイントURLを指定します。例:
<s0:service name="JmsTransportService">
<s0:port binding="s1:JmsTransportServiceSoapBindingjms" name="JmsTransportServicePort">
<s2:address location="jms://localhost:7001/transports/JmsTransport?URI=JMSTransportQueue"/>
</s0:port>
</s0:service>
JMSトランスポートを使用してWebサービスを呼び出すクライアント・アプリケーションの記述は、HTTPトランスポートを使用する場合の記述と同様に行います。ただ1つ異なるのは、必ず、JMSキュー(@WLJmsTransport
アノテーションまたはjwsc
Antタスクの<WLJmsTransport>
子要素で指定)とその他のJMSオブジェクトが作成済でなければならないという点です。詳細については、「Javaから開始するJMSトランスポートの使用: 主な手順」または「WSDLから開始するJMSトランスポートの使用: 主な手順」を参照してください。
HTTPを使用してJMSトランスポートで構成されたWebサービスを呼び出すことはできませんが、HTTPを使用してそのWebサービスのWSDLを参照することはできます。これにより、clientgen
AntタスクはWebサービスのJAX-RPCスタブを作成することができます。たとえば、この項で示すWebサービスのWSDLのためのURLは、次のようになります。
http://host:port/transports/JMSTransport?WSDL
ただし、デプロイされたWebサービスのWSDLにおけるエンドポイント・アドレスでは、http://
ではなくjms://
が使用され、このアドレスには修飾子?URI=
JMS_QUEUEが含まれるため、clientgen
AntタスクはWebサービス呼出し時にJMSトランスポートを使用するために必要なスタブを自動作成し、クライアント・アプリケーション側で通常と違う処理を行う必要はありません。JMSエンドポイントのアドレスの例を次に示します。
jms://host:port/transports/JMSTransport?URI=JMSTransportQueue
注意: JMSトランスポートを使用して呼び出すWebサービスをトランザクションのコンテキスト内でも実行することを指定した(つまり、JWSファイルに |
Webサービス呼出しに関する一般情報は、『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』のWebサービスの呼出しに関する項を参照してください。
clientgen
で生成されたJAX-RPCスタブを使用してWebサービスを呼び出すクライアント・アプリケーションを作成する場合、Webサービスのデフォルトのサービス・アドレスURLは、Service
コンストラクタのWSDLファイル引数の<address>
要素で指定したものとなります。
ただし、場合によっては、特にクラスタにデプロイされているWebLogic Webサービスを呼び出す際に、クラスタのアドレスまたはクラスタ内の管理対象サーバーのアドレスのリストを指定する場合には、このアドレスをオーバーライドする必要があることがあります。また、t3
プロトコルを使用してWebサービスを呼び出すことが必要な場合もあります。JMSトランスポートの使用時にこのサービス・エンドポイントURLをオーバーライドするには、次の例で示すように、weblogic.wsee.jaxrpc.WLStub.JMS_TRANSPORT_JNDI_URL
スタブ・プロパティを使用します。
package examples.webservices.jmstransport.client; import weblogic.wsee.jaxrpc.WLStub; import java.rmi.RemoteException; import javax.xml.rpc.ServiceException; import javax.xml.rpc.Stub; /** * This is a simple standalone client application that invokes the * the <code>sayHello</code> operation of the JMSTransport Web service. */ public class Main { public static void main(String[] args) throws ServiceException, RemoteException{ JMSTransportService service = new JMSTransportService_Impl(args[0] + "?WSDL" ); JMSTransportPortType port = service.getJMSTransportServicePort(); Stub stub = (Stub) port; stub._setProperty(WLStub.JMS_TRANSPORT_JNDI_URL, "t3://shackell01.amer.com:7001"); try { String result = null; result = port.sayHello("Hi there! "); System.out.println( "Got JMS result: " + result ); } catch (RemoteException e) { throw e; } } }
その他のスタブ・プロパティについては、Oracle WebLogic Server APIリファレンスのWLStubに関する項を参照してください。
JMSトランスポートを使用する場合、Webサービス・ランタイムは、デフォルトではjavax.jms.TextMessage
オブジェクトを使用してメッセージを送信します。ほとんどのクライアント・アプリケーションはこのデフォルトのままで十分ですが、状況によっては普通のテキストではなくバイナリ・データを送信する必要がある場合もあります。その場合は、Webサービス・ランタイムでjavax.jms.BytesMessage
を使用することをリクエストする必要があります。そのためには、クライアント・アプリケーションでWLStub.JMS_TRANSPORT_MESSAGE_TYPE
スタブ・プロパティを使用し、値としてWLStub.JMS_BYTESMESSAGE
を設定します。次に例を示します。
stub._setProperty(WLStub.JMS_TRANSPORT_MESSAGE_TYPE, WLStub.JMS_BYTESMESSAGE);
Webサービス・ランタイムは、リクエストと同じメッセージ・データ型を使用してレスポンスを戻します。
このプロパティを設定できるクライアント・アプリケーションの例については、「デフォルトのサービス・アドレスURLのオーバーライド」を参照してください。その他のスタブ・プロパティについては、Oracle WebLogic Server APIリファレンスのWLStubに関する項を参照してください。
「JMSトランスポートを使用したWebLogic Webサービスの呼出し」で説明したように、デプロイされているWebサービスのWSDLには、デフォルトでHTTPでアクセスできるようになっています。WSDLファイルへのアクセスを無効にする場合(特に、ファイアウォールの外でWebサービスにアクセスできる場合)は、次のいずれかを実行します。
JWSファイルで、weblogic.jws.WSDL
アノテーションを使用してプログラム的にアクセスを無効にします。詳細は、『Oracle WebLogic Server WebLogic Webサービス・リファレンス』のweblogic.jws.WSDLに関する項を参照してください。
Webサービスをデプロイした後に、管理コンソールを使用してWSDLへのアクセスを無効にします。この場合、構成情報は、アノテーションではなくデプロイメント・プラン内に格納されます。
このタスクを管理コンソールを使用して実行する場合は、デプロイしたWebサービスの「構成」→「全般」ページに移動し、「動的WSDLの表示を有効化」チェック・ボックスの選択を解除します。この変更を有効にするには、構成をデプロイメント・プランに保存した後に、Webサービス(またはそのエンタープライズ・アプリケーション)を再デプロイ(更新)する必要があります。