エンタープライズ:ニュース | 2003/05/13 01:29:00 更新 |
Webサービスをよりフレキシブルにするためには (6/6)
結果の表示メッセージはコンソールに表示される。またサービスキューに送信されることになる。ここでは、テストアカウントである「joe」を使いインボークされるTranslatonRequestorプログラムを確認することができるだろう。また、このサンプルのためにセットアップしたresponse queue(testResponseQueue)を見ることも可能だ(Figure 5)。
サーバはメッセージを処理し、translation results document もしくは SOAP fault を返信する。 ReplyProcessorプログラムは、レスポンスハンドリング(Listing 3)を行う。この例では、リクエストされたプログラムとは異なるものが返信プロセスで利用される。これは要求されない。ReplyProcessorは、以下のようにインボークされる。
java asynchBabelFish. ReplyProcessor <username> <password> <responseQueue> |
プログラムは最初に、command-line アーギュメントで指定されたresponse queueに対し、JMS connectionを確立する。そして自身を、キューリスナーとして登録することになる。典型的なJMSスタイルとして入力されるメッセージは、ReplyProcessor onMessage()メソッドに対しコールバックされる形だ。
メッセージを手に入れよう
リクエストキューに入力されるそれぞれの新しいメッセージに対し、onMessage() はテキストメッセージのフォームでメッセージからSOAP envelopeを作り直す。そして、TextMessageからResponseEnvelope constructorの中に文字列を受け渡すのだ。
ResponseEnvelope response= new ResponseEnvelope( ((TextMessage)message). getText()); |
ResponseEnvelope (Listing 4) はhelper classであり、translation results documentを容易にするよう機能する。そのコンストラクタはSOAP XMLフォームで文字列を受け取り、Apache SOAP Envelopeオブジェクトを生成するものだ。get()メソッドを使い (source textや translation textなどの) 必要なパラメータを抽出する。toString()メソッドは、SOAPメッセージの生のXMLを返す。response messageの相関IDとSOAP document自身が表示される。
// The correlation ID matches the // JMS Message ID of the original // request message System.out.println("\nResponse: JMS Correlation ID = "+message. getJMSCorrelationID()+"\n"); // Print out the response SOAP // envelope System.out.println(response); |
最後に、translation results documentから必要な4つのパラメータがプリントされる(SourceText、 Source Language、Translation Text、Translation Language)。
// And print out a summary of the // translation. System.out.println("\""+response. getSourceText()+"\" ( "+response.getSourceLanguage() +") translates to \""+response. getTranslationText()+"\" ( "+response. getTranslationLanguage() +")\n\n");; |
もしも、入力メッセージが有効なtranslation results documentではなく、サーバから送られたSOAP faultを保持するのであれば、SOAP faultから発行されたfault stringと共に例外処理が行われ、さらにResponseEnvelopeの生成が試みられる。例外処理のスタックトレースが表示されるのだ(Listing 5)。前述するTranslationRequestor (Figure 6)を使い、リクエストに対するresponse documentの処理として、プログラムのアウトプットを確認できるだろう。
RPCのメカニズムは、Webサービスの用途を限定するものだ。 非同期メッセージングとWebサービスのインテグレーションは現実に存在する。SOAPとハイレベルなWebサービスプロトコルは、トランスポートにニュートラルなデザインだ。分散コンピューティングにおいて、1つのサイズにすべてが合うといったアプローチはない。JMSはインターネット上で関連付けられるほかのポピュラーなSOAPスタックと共に使用でき、信頼性のある非同期トランスポートを提供するものだ。SOAPクライアントライブラリにおける選択に関わらず、エンタープライズでの効果的なデータトランスポートの提供が、非同期メッセージングトランスポートにより どのように実現できるか考えてみよう。AsynchBabelFishサンプルは、日常の仕事に適したものではないかもしれない。しかし、どのようにSOAPがJMSとインテグレートするかを理解するには最適なデモンストレーションだろう。
Article Copyright 2003 (c) by Fawcette Technical Publications Inc., Palo Alto, CA USA. Published under license from FTP. www.fawcette.com[David Chappell, Tony Hong,XML Magazine]