Oracle® Fusion Middleware Oracle WebLogic Server JAX-RPC Webサービスの高度な機能のプログラミング 11g リリース1(10.3.3) B61634-01 |
|
前 |
次 |
以下の節では、接続プロトコルとしての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ファイルのコーディング時にはニーズに最適な転送が分からない場合があるため、転送は、<WLJmsTransport> 子要素を使用してビルド時に指定することをお薦めします。 |
次の手順では、Javaから開始する際に、JMSトランスポートを使用して現在のWebサービスを呼び出すために必要なすべての手順について説明します。
注意: Webサービスを実装する基本的なJWSファイルが作成されており、JMSを使用して呼び出すWebサービスを構成することが前提となっています。また、Antベースの開発環境を設定済であり、かつjwsc Antタスクを実行してサービスをデプロイするためのターゲットを含む、作業用のbuild.xml ファイルがあることも前提となっています。詳細は、『Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド』を参照してください。 |
表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ファイルのコーディング時にはニーズに最適な転送が分からない場合があるため、転送は、<WLJmsTransport> 子要素を使用してビルド時に指定することをお薦めします。 |
次の手順では、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』の既存ドメインの構成に関する項を参照してください。 |
リソースを手作業で構成する場合、以下の手順を実行します。
表8-3 JMS転送WebサービスのホストWebLogic Serverインスタンスを手作業で構成する手順
# |
手順 | 説明 |
---|---|---|
1 |
ホストWebLogic Serverインスタンスが格納されたドメインのAdministration Consoleを起動します。 |
ブラウザでAdministration Consoleを起動するには、次の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ファイルをプログラムした時点で、クライアント・アプリケーションで(HTTP/Sではなく)JMSトランスポートを使用してWebサービスを呼び出すことが決まっている場合は、@WLJmsTransport
を使用してその呼出しの詳細を指定できます。後のビルド時に、JWSファイルで定義されている呼出しをオーバーライドして、JMSトランスポート指定を追加することができます。そのためには、「jwsc Antタスクの<WLJmsTransport>子要素の使用」の説明に従い、jwsc
Antタスクの<WLJmsTransport>
子要素を指定します。
@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ファイルに@weblogic.jws.Transactional アノテーションが含まれている)場合は、そのサービスを呼び出す際に非同期のリクエストとレスポンスを使用する必要があります。そうしないと、デッドロックが発生して呼出しが失敗します。 |
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サービス(またはそのエンタープライズ・アプリケーション)を再デプロイ(更新)する必要があります。