![]() ![]() ![]() ![]() |
以下の節では、接続プロトコルとしての JMS 転送の使用について説明します。
通常、クライアント アプリケーションから WebLogic Web サービスを呼び出すときは、接続プロトコルとして HTTP/S が使用されます。しかし、クライアント アプリケーションが転送に JMS を使用するように WebLogic Web サービスをコンフィグレーションすることもできます。
JMS 転送を使用すると、信頼性、スケーラビリティ、サービス品質が向上します。Web サービスの信頼性のあるメッセージングの場合と同様に、メソッド呼び出しがまだキューに入っているときに WebLogic Server が停止しても、再起動すればすぐに処理が行われます。クライアントは、Web サービスを呼び出す際に呼び出しからの応答を待機しないため、クライアントの実行は続行可能です。ただし、JMS 転送の使用では、HTTP/S より若干オーバーヘッドが大きくなり、プログラムが複雑になります。
JWS アノテーションか、後の節で説明する jwsc
Ant タスクの子要素のどちらかを使用して、転送をコンフィグレーションします。WebLogic Web サービスで、接続転送に JMS を使用するようにコンフィグレーションを行った場合、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> 子要素を使用してビルド時に指定することをお勧めします。 |
以下に、Java から開始する際に JMS 転送を使用して現在の Web サービスを呼び出し可能とするために必要なすべての手順について説明します。
注意 : | Web サービスを実装する基本的な JWS ファイルが作成されており、JMS を使用して呼び出す Web サービスをコンフィグレーションすることが前提となっています。また、Ant ベースの開発環境を設定済みであり、かつ jwsc Ant タスクを実行して、サービスをデプロイするためのターゲットを含む、作業用の build.xml ファイルがあることが前提となっています。詳細については、『JAX-RPC を使用した WebLogic Web サービスの開始』を参照してください。 |
<WLJmsTransport> 子要素を使用して、JWS ファイルで定義されている転送をオーバーライドする。この手順は、手順 2 で @WLJmsTransport アノテーションを JWS ファイルに追加しなかった場合に必須。追加している場合、この手順は省略可能。
|
||
|
||
JMS 転送を使用した Web サービスを呼び出すためのクライアント アプリケーションの更新については、「JMS 転送を使用した WebLogic Web サービスの呼び出し」を参照してください。
WSDL から開始する際に JMS 転送を使用するには、以下の少なくとも 1 つのタスクを実行する必要があります。
注意 : | JWS ファイルのコーディング時にはニーズに最適な転送が分からない場合があるため、転送は、<WLJmsTransport> 子要素を使用してビルド時に指定することをお勧めします。 |
以下に、WSDL から開始する際に JMS 転送を使用して現在の Web サービスを呼び出し可能とするために必要なすべての手順について説明します。
注意 : | この手順では既存の WSDL ファイルがあることを前提としています。 |
|
||
|
||
wsdlc Ant タスクにより途中まで作成済みの JWS ファイルが生成される。必要な動作を Web サービスに実装するには、独自のビジネス コードを Web サービスに追加する必要がある。『JAX-RPC を使用した WebLogic Web サービスの開始』の「wsdlc で生成される途中まで作成済みの JWS 実装クラス ファイルの更新」を参照。
@WLJmsTransport アノテーションが含まれる。@WLJmsTransport アノテーションが JWS ファイルに含まれない場合、以下の少なくとも 1 つの作業を行う必要がある。
|
||
<WLJmsTransport> 子要素を使用して、JWS ファイルで定義されている転送をオーバーライドする。JWS ファイルに @WLJmsTransport アノテーションが含まれない場合、この手順は必須 (手順 4 を参照)。含まれる場合、この手順は省略可能。
|
||
wsdlc Ant タスクによって生成されたアーティファクトと更新した JWS 実装ファイルを指定して、Web サービスを実装するエンタープライズ アプリケーションを生成する。『JAX-RPC を使用した WebLogic Web サービスの開始』の「jwsc WebLogic Web サービス Ant タスクの実行」を参照。
|
||
JMS 転送を使用した Web サービスを呼び出すためのクライアント アプリケーションの更新については、「JMS 転送を使用した WebLogic Web サービスの呼び出し」を参照してください。
JMS 転送 Web サービスのデプロイ先となる WebLogic Server インスタンスをコンフィグレーションする際には、Web サービスのランタイムで内部的に使用される、JMS サーバやモジュールなどの JMS リソースがコンフィグレーションされます。
これらのリソースは手作業でもコンフィグレーションできますが、コンフィグレーション ウィザードで、Web サービス固有の拡張テンプレートを使用して WebLogic Server ドメインを拡張することもできます。コンフィグレーション ウィザードを使用すると、必要なコンフィグレーション手順が大幅に簡素化されます。詳細については、『JAX-RPC を使用した WebLogic Web サービスの開始』の「Web サービス機能用のドメイン コンフィグレーション」を参照してください。
注意 : | または、WLST を使用してリソースをコンフィグレーションすることもできます。WLST によるドメインの拡張については、『WebLogic Scripting Tool ガイド』の「既存ドメインのコンフィグレーション」を参照してください。 |
リソースを手作業でコンフィグレーションする場合、以下の手順を実行します。
|
||
|
||
JWS ファイルをプログラムした時点で、Web サービスの呼び出しにクライアント アプリケーションで (HTTP/S ではなく) JMS 転送を使用することが決まっている場合は、@WLJmsTransport
を使用してその呼び出しの詳細を指定できます。後のビルド時に、「jwsc Ant タスクの <WLJmsTransport> 子要素の使用」に従い、jwsc
Ant タスクの <WLJmsTransport>
子要素を指定して、JWS ファイルで定義されている呼び出しをオーバーライドし、さらなる JMS 転送指定を追加できます。
@WLJmsTransport
アノテーションを使用する際は、以下のガイドラインに従ってください。
次の例では、@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)
// Web サービスの URI を構成するのに使用されるコンテキスト パスとサービス URI が
// 「transports/JMSTransport」であることを指定する、WebLogic 固有の
// JWS アノテーション
@WLJmsTransport(contextPath="transports", serviceUri="JMSTransport",
queue="JMSTransportQueue", portName="JMSTransportServicePort",
connectionFactory="JMSTransportConnectionFactory")
/**
* この JWS ファイルは、1 つのオペレーション sayHello を含む簡単な
* Java クラス実装の WebLogic Web サービスの基本となる
*/
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>
子要素を使用して、ビルド時にも指定できます。ビルド時に転送を指定する理由としては、次のようなものが挙げられます。
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 タスクの使用に関する詳細は、『WebLogic Web サービス リファレンス』の「jwsc」を参照してください。
JMS 転送を使用するように WSDL を更新するには、JMS 転送情報を定義する <wsdl:binding>
定義と <wsdl:service>
定義を追加する必要があります。これらの定義は、以下のいずれかの方法で追加できます。
どちらの場合でも、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 サービスの呼び出しに関する全般的な情報については、『JAX-RPC を使用した WebLogic 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;
/**
* JMSTransport Web サービスの sayHello オペレーションを呼び出す
* 簡単なスタンドアロンのクライアント アプリケーション
*/
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,
try {
"t3://shackell01.amer.bea.com:7001");
String result = null;
result = port.sayHello("Hi there!");
System.out.println( "Got JMS result: " + result );
} catch (RemoteException e) {
throw e;
}
}
}
その他のスタブ プロパティについては、WLStub の Javadoc リファレンス ドキュメントを参照してください。
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 のオーバーライド」を参照してください。その他のスタブ プロパティについては、WLStub の Javadoc リファレンス ドキュメントを参照してください。
「JMS 転送を使用した WebLogic Web サービスの呼び出し」で説明したように、デプロイされている Web サービスの WSDL には、デフォルトで HTTP でアクセスできるようになっています。WSDL ファイルへのアクセスを無効にしたい場合 (特に、ファイアウォールの外で Web サービスにアクセスできる場合) は、以下のいずれかのタスクを実行します。
weblogic.jws.WSDL
アノテーションを使用してプログラム的にアクセスを無効にする。詳細については、『WebLogic Web サービス リファレンス』の「weblogic.jws.WSDL」を参照してください。
このタスクを Administration Console を使用して実行する場合は、デプロイした Web サービスの [コンフィグレーション|全般] ページに移動し、[動的 WSDL の表示を有効化] チェック ボックスのチェックをはずします。この変更を有効にするには、コンフィグレーションをデプロイメント プランに保存した後に、Web サービス (またはそのエンタープライズ アプリケーション) を再デプロイ (更新) する必要があります。
![]() ![]() ![]() |