HTTP転送を介してSOAPメッセージを交換することは、従来の要求/応答タイプのアプリケーションには有効です。 RPC (リモートプロシージャコール)のプログラミングパラダイムは、簡単に使用して理解することができます。 クライアントはメッセージを送信して、サーバが応答を返すことを決定するまでブロックされます。 呼び出し中にエラーが発生すると、クライアントはそれをすぐに認識して適切なアクションを取ることができます。RPCスタイルは、アプリケーションのクラスが異なる場合はあまり有効ではありません。 例えば、購入注文の処理を発信するアプリケーションでは、サーバがその要求をすぐに処理するかどうかは配慮しません。 しかし実際には、不必要なピーク時のシステムへのロードを避けて、購入注文を夜間に処理するようにアプリケーションに書き込むことができます。
上記の購入注文システムのようなアプリケーションでは、クライアントは壊滅的なエラー以外で要求が紛失されないように、安全な場所に配置されることだけを確認します。 この問題の一般的な解決方法として、メッセージングシステムを使用します。メッセージングシステムでは、要求がキューに入れられキューを受信したアプリケーションによってあとで処理されます。
JMS(Java Message Service)は、適切なJavaおよびJ2EEアプリケーションのメッセージングAPIとして出現しました。 JMSは、企業メッセージングシステムにアクセスするためのAPIです。つまり、キューおよびトピックのようなメッセージの概念を参照する場合に、プロデューサおよびコンシューマアプリケーションと同様にクライアントアプリケーションはポータブルで共通のボキャブラリを使用することができます。
Novell exteNd WebサービスSDKでは、SOAPメッセージのJMS宛先(キューまたはトピック)への送信をサポートしています。 通常のHTTP転送を使用する代わりに、Novell exteNd WSSDKランタイムではメッセージを転送するのにJMS転送を使用します。 このようなメッセージは一般的に「一方向」で、クライアントアプリケーションでは応答を期待しませんが、Novell exteNd WSSDKクライアントではオプションで別の宛先で応答メッセージを待つことができます。
サーバ側では、Novell exteNd WSSDKはスケルトンベースのMDB(Message Driven Bean)をサポートしています。 MDBは、J2EE 1.3に導入された新しいBeanタイプで、JMS宛先からのメッセージを受信し、J2EEコンテナ環境の中で処理します。 これは、例えばMDBが(分散)トランザクションのコンテキストでメッセージを処理できるということです。 Novell exteNd WSSDKのMDBスケルトンは、サーブレットベースのスケルトンと同じように機能します。
サーブレットベースのスケルトンでは、生成された基本クラスは
doPost
メソッドを実装します。doPost
が呼び出されると、Novell exteNd WSSDKはSOAPメッセージを抽出してユーザに提供される実装クラスのビジネスメソッドに配信します。 呼び出しの結果はサーブレット応答に書き込まれて呼び出し側に返されます。 要するに、ユーザはビジネスメソッドの実装だけに注意を払えばよいのです。MDBスケルトンは生成された基本クラスで、
onMessage
メソッドに実装されます。 サーブレットでは、onMessage
の各呼び出しによってNovell exteNd WSSDKは、SOAPメッセージからパラメータを抽出して要求されたビジネスメソッドを呼び出します。 戻り値がある場合は、MDBスケルトンはそれを応答宛先に返します。 ユーザの実装クラスは、サーブレットでもMDB基本クラスが使用されていても同じです。SOAPメッセージの転送にJMSを使用するWebサービスの展開は、一般的に次に示す2つの方法の1つを使用して行われます。
最初のシナリオを下の図1に示します。 このシナリオでは、クライアントアプリケーションは一般的にファイヤウォール内にあり、JMSサーバおよびEJBコンテナと同じローカルエリアネットワーク上にあります。 また、クライアントはJMSプロバイダの機能を使用してファイヤウォール間でメッセージを転送します。
- Novell exteNd WebサービスSDKクライアントは、JMS転送を使用してSOAPメッセージをJMS宛先に送信します。 メッセージはNovell exteNd WebサービスSDK MDBベースのWebサービスによって処理されるか、ほかの方法を使用して実装されます。 オプションで、応答SOAPメッセージを応答宛先から読み取ってクライアントに返します。
- Novell exteNd WebサービスSDKクライアントまたはほかのクライアントは、通常の方法でHTTP転送を使用してURLにメッセージを送信します。 そのURLに展開されたサーブレットは、着信SOAPメッセージをJMS宛先に転送します。 再びメッセージはNovell exteNd WebサービスSDK MDBベースのWebサービスによって処理されるか、ほかの方法を使用して実装されます。 この場合、応答メッセージも「ルータ」サーブレットによって読み取られて呼び出し側に返されます。
![]()
図1: JMS宛先(キューまたはトピック)経由でSOAPメッセージを交換するためにJMS転送を使用するNovell exteNd WebサービスSDK図1で示した4つの手順を以下により詳細に説明します。
2番目のシナリオを下の図2に示します。 この場合では、Novell exteNd WebサービスSDKクライアントは通常のSOAP/HTTPを使用してサーブレットベースのエンドポイントにメッセージを転送します。 サーブレットは単なるルータで、JMS宛先のファサードとして機能します。 JMSルータは着信SOAPメッセージを受信してそれをJMS宛先に転送します。
- 最初に、JMS転送が設定されたNovell exteNd WebサービスSDKは、メッセージをJMS宛先(この例ではキュー)に送信します。 使用される転送がJMSでもHTTPでもクライアントアプリケーションは同じです。 通常のJAX-RPC APIを使用してSOAPメッセージが送信されます。
- 次に、JMSリスナは宛先からメッセージを受信します。 この場合は、MDBベースのNovell exteNd WebサービスSDKスケルトンを使用します。 MDBは適切なビジネスメソッドで要求を処理し、オプションで結果を応答宛先に返します。 スケルトン実装クラスは、サーブレットベースのスケルトンが使用された場合は同じです。 JMS宛先からメッセージを受信して応答を送信するコードは、Novell exteNd WebサービスSDKによって生成されたサーブレットベースのクラスで自動的に行われます。
- 3番目に、メソッドに戻り値がある場合は、それをSOAPメッセージとして応答宛先に送信します。
- 4番目に、戻り値がある場合、Novell exteNd WebサービスSDKクライアントは、サーバがメッセージを処理するのを待つ間それをブロックします。 クライアントアプリケーションでは、エラーが発生したりサーバがタイムリーに応答しない場合に無期限に待つことがないように、タイムアウトを設定することができます。
図2で示した6つの手順を以下により詳細に説明します。 ![]()
図2: JMS宛先(キューまたはトピック)経由でSOAPメッセージを交換するNovell exteNd WebサービスSDK JMS「ルータ」サーブレットJMS転送を使用した2つの例に示すように、複数の設定および多大な柔軟性を持たせることが可能です。 このセクションでは、次に示す例を含め、さらにNovell exteNd WebサービスSDKのJMS転送機能について説明します。
- クライアント(Novell exteNd WebサービスSDKまたはその他)は、Novell exteNd WebサービスSDK JMSルータサーブレットにHTTP転送を使用してSOAPメッセージを送信します。
- ルータサーブレットはメッセージをルータサーブレット設定の一部として定義された宛先に転送します。 特定のJMSプロバイダに接続するパラメータもルータサーブレット設定の一部です。
- メッセージ駆動型BeanまたはほかのJMSメッセージリスナは、宛先からSOAPメッセージを消費します。 この場合は、Novell exteNd WebサービスSDK MDBベースのスケルトンを表示しますは、。 詳細については、上記の説明を参照してください。
- MDBスケルトンは、オプションで応答メッセージを応答宛先に送信します。
- Novell exteNd WebサービスSDK JMSルータサーブレット応答メッセージを消費します。
- 応答メッセージは通常のHTTP転送を介してクライアントに返信されます。
トップに戻る「JMS」の例では、JMS宛先にメッセージを送る簡単なサーブレットを作成する方法を示します。 Novell exteNd WebサービスSDKサービスには、メッセージを送信および受信する2つのメソッドがあります。
2番目の「JMS」の例では、JMS転送を使用するNovell exteNd WebサービスSDKクライアントを展開する方法を示します。 クライアントは、デフォルトのNovell exteNd MQ JMSプロバイダを使用していない場合はプロパティを設定する必要があります。
「MDB」の例では、MDBベースのNovell exteNd WebサービスSDKサービスを作成する方法を示します。 スケルトンクラスの実装は以前見たものと同じですが、アプリケーションのパッケージングは異なります。