GlassFish v2.1 で WebService NetBeans6.5 を使って簡単 Web サービスアプリケーションの作成 その4

12 6 月, 2009 (00:52) | GlassFish, OpenSource, Java

前回の投稿からかなりの期間が過ぎてしまい、まことに申し訳ありませんが、今回は予告したとおり、 javax.jws.soap.SOAPMessageHandler の実装方法について執筆して行きたいと思います。今回の GlassFish ターゲットは、もうすっかり商用版として定着してきた v2.1 にてアプリケーションの作成作業を進めて行きます。

まずはじめに JAX-WS Metro を利用したアプリケーションで、 SOAP メッセージを可視化する方法について触れておきたいのですが、方法論としては 2 種類あります。 2 つ目は、 Web サービスノードを右クリックしてテストを実行する方法、もうひとつが今回ご紹介する javax.jws.soap.SOAPMessageHandler を利用した方法になります。単体テストレベルでの可視化については、テスト実行によるメッセージの参照でことたりますが、いざ本番運用を迎えた際、あるいはプレ本番のテスト時などで、問題が発生した時に、やはりアプリケーションや WSDL だけでの解析では、なかなかその原因を突き止めるのは難しいものがあるので、実際に問題が発生した際に、どういったメッセージングがされたかを可視化しておくことは、問題解決する上でより良いことと心得ます。

そんなわけで、 NetBeans 6.5 上で、どうやって実装していくのかその作業手順について、Html の画面から、商品名と数量を入力すると、合計金額を返すと言う簡単なアプリケーションにメッセージハンドラを追加して行く方法を、以下に示して参ります。

1、 MessageHandler の作成

MessageHandler は Web サービス endpoint 及び、クライアントの双方に配備することができますが、どちらか片側だけで十分なため、今回は endpoint 側に配備することとします。サーバー側のプロジェクトをドラッグしてして「ファイル(F)」→「新規ファイル(N)」の順にクリックして新規ファイル作成ダイアログを開いたのち、「 Web サービス」→「メッセージハンドラ」の順にクリックして「次へ>」をクリックします。以下にあるように、ハンドラクラス名とパッケージを入力して「完了(F)」をクリックします。

[画像1]

「完了(F)」をクリックすると、以下のようなテンプレートで用意されている雛形コードが展開されます。これにインターセプトしたオブジェクトを出力するコードを実装して行きます。
public class SparrowsCafeMessageHandler implements SOAPHandler {

  public boolean handleMessage(SOAPMessageContext messageContext) {
    SOAPMessage msg = messageContext.getMessage();
    return true;
  }

  public Set getHeaders() {
    return Collections.EMPTY_SET;
  }

  public boolean handleFault(SOAPMessageContext messageContext) {
    return true;
  }

  public void close(MessageContext context) {
  }

}
今回は、通信ログとしてメッセージをテキストファイルへ出力するコードを実装します。実装する場所は、 handleMessage() になります。出力ファイルをオープンした後、まず最初に、ハンドラが受け取ったメッセージコンテキストが、要求メッセージなのか応答メッセージなのかを判断するためのコードを以下のように記述します。ファイル出力には java.io.PrintStream を使用します。この理由については後ほどご説明します。実装するコードについては以下のとおり :
if(((Boolean)messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue()) {
  out.println("¥n" + CALENDAR.getTime().toString() + " Out Bound Message");
} else {
  out.println("¥n" + CALENDAR.getTime().toString() + " In Bound Message");
}
何故このコードを実装するのかと言うと、メッセージハンドラは、ハンドラチェーンを経由して、 SOAP Message の受信時及び、送信時の 2 回呼ばれることになります。そのまま情報を垂れ流してしまうとどちらのメッセージ内容が出力されたのか、判らなくなるためこの判定を実装します。

そしていよいよ SOAP Message 本体の出力コードを実装します。 SOAP Message を出力するには、 javax.xml.soap.SOAPMessage#writeTo(java.io.OutputStream) を使用します。実装コードについては、以下のとおり :
SOAPMessage msg = messageContext.getMessage();
msg.writeTo(out);
先に java.io.PrintStream を使用することを記載しましたが、 PrintStream は文字列をそのまま出力できると言うメリットと、 close() を呼び出しても例外を吸収してくれると言うメリットがあることから、利用するものと考察します。英文ですが、こちらに詳しい情報が掲載されています。参考にして下さい。これでメッセージハンドラの作成は完了です。

2、メッセージハンドラーを設定する

この作業は NetBeans の GUI を利用して行います。プロジェクト配下にある Web サービスを展開し、該当する Web サービスノードをドラッグして右クリック、「ハンドラの設定」をクリックします。

[画像2]

設定ダイアログが開くので、「追加」をクリックしてハンドラ追加ダイアログを開き、先ほど作成したハンドラクラスを選択して「了解」をクリックします。

[画像3]

設定ダイアログでハンドラクラスが登録されたことを確認したら「了解」をクリックします。これで設定は完了です。設定が完了すると、 Web サービスとして公開するクラスのカレントパッケージ配下に、 xml ファイルが出現します。

[画像4]

ここまで出来たら Web サービスとして公開するクラスを覗いてみましょう。 @WebService アノテーションに更にもう1つ、 @HandlerChain アノテーションが追加されたことを見つけられます。挿入されたコードは以下のとおり :
@HandlerChain(file = "SparrowsCafe_handler.xml")これでメッセージハンドラが動作する準備が全て整いました。後は GlassFish v2.1 へ配備するのみです。今回私が作成したハンドラクラスのメッセージログ出力先は、 $DOMAIN_HOME/logs/ としました。実行後のログ出力結果は以下のとおりです。
Fri Jun 12 00:15:07 JST 2009 In Bound Message
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header><To xmlns="http://www.w3.org/2005/08/addressing">http://localhost:8080/portroyal/SparrowsCafeService</To><Action xmlns="http://www.w3.org/2005/08/addressing">http://endpoint.sparrow.glassfish.jp/SparrowsCafe/purchaseRequest</Action><ReplyTo xmlns="http://www.w3.org/2005/08/addressing">
<Address>http://www.w3.org/2005/08/addressing/anonymous</Address>
</ReplyTo><MessageID xmlns="http://www.w3.org/2005/08/addressing">uuid:50e8ebfe-884f-4ca3-9cd4-523e7d408e60</MessageID><ns2:Sequence xmlns:ns2="http://schemas.xmlsoap.org/ws/2005/02/rm" xmlns:ns3="http://www.w3.org/2005/08/addressing" xmlns:ns4="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:ns5="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:ns6="http://schemas.microsoft.com/ws/2006/05/rm"><ns2:Identifier>uuid:54c8a756-01e3-4fb4-bb8c-136c9c466f65</ns2:Identifier><ns2:MessageNumber>1</ns2:MessageNumber></ns2:Sequence><ns2:AckRequested xmlns:ns2="http://schemas.xmlsoap.org/ws/2005/02/rm" xmlns:ns3="http://www.w3.org/2005/08/addressing" xmlns:ns4="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:ns5="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:ns6="http://schemas.microsoft.com/ws/2006/05/rm"><ns2:Identifier>uuid:54c8a756-01e3-4fb4-bb8c-136c9c466f65</ns2:Identifier></ns2:AckRequested></S:Header><S:Body><ns2:purchase xmlns:ns2="http://endpoint.sparrow.glassfish.jp/"><nameOfCoffee>kilimanjaro</nameOfCoffee><quantum>5</quantum></ns2:purchase></S:Body></S:Envelope>
Fri Jun 12 00:15:07 JST 2009 Out Bound Message
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Header><To xmlns="http://www.w3.org/2005/08/addressing">http://www.w3.org/2005/08/addressing/anonymous</To><Action xmlns="http://www.w3.org/2005/08/addressing">http://endpoint.sparrow.glassfish.jp/SparrowsCafe/purchaseResponse</Action><MessageID xmlns="http://www.w3.org/2005/08/addressing">uuid:b2cbbb9c-2ec8-4b21-8080-22098aa2bf5e</MessageID><RelatesTo xmlns="http://www.w3.org/2005/08/addressing">uuid:50e8ebfe-884f-4ca3-9cd4-523e7d408e60</RelatesTo></S:Header><S:Body><ns2:purchaseResponse xmlns:ns2="http://endpoint.sparrow.glassfish.jp/"><return>The bill for the product is $28.25. Thank you for using our service yo- ho- !</return></ns2:purchaseResponse></S:Body></S:Envelope>
javax.jws.soap.SOAPMessageHandler を利用した通信ログの出力、様々な用途に活用できるものと思われます。是非皆さんも一度お試しください。今回トピックに使用したサンプルアプリケーションとソースコード、通信ログファイルについてはこちらから取得できます。どうぞご活用ください (*`д´)b OK♪

さて 4 回に渡って投稿させていただきました Metro 関連トピック、次回は Java Hot Topics にて登壇した時にでも、もう少し前進したお話ができるかと思います。まだ日程は調整中ですが、決まり次第是非ご参加頂きたく思います。 Metro 関連記事の今後は未定ですが、もう少し先になると思いますが、 WSIT 関連のトピックでも執筆しようかと思います。その時またお付き合いください。

Drink up hier tie's YO- HO-

サン・マイクロシステムズ イベント情報サン・マイクロシステムズ キャンペーン情報

Write a comment





*
画像に書かれた文字を入力してください

スパム対策用画像
ログインすると画像認証なしで投稿できます

ホットワード GlassFish WebService 簡単 サービス アプリケーション
割引クーポンまとめ情報 - クー割