SOAP実装

今案件でAxis2S2Axis2)を使ってたのですが、レスポンスオブジェクトのメンバに配列を持っているとどうも処理が重い。
S2連携があるってことで、採用していたのですが、少し耐え難い状況に。

で、別実装でcodehausのXFireを使ってみようと。
レスポンスオブジェクトが

public class ResponseObject {
    private int no;
    private Child[] children;
(setter/getter省略)
}

public class Child {
   private String name;
   private int age;
   private String address;
}

こんな感じのを使ったときに自分の環境ではchildrenの長さがにもよりますが大体5〜10倍くらいの速度になりました。

で、どうしましょ?となったときに、既存のS2Daoとかは残したいとの要望で、S2XFireなるものを作成。


現時点では、S2Containerの中のインスタンスをサービスとして登録するくらい。
ここら辺のノウハウは結構S2Axis2を参考にさせていただきました。


たとえば

<include path="s2-axis.dicon"/>

として、

<meta name="axis-service"/>

で、サービスとして識別のところなんかそのまま持ってきてたり。。。w

<include paht="s2-xfire.dicon"/>

を入れて、

サービスオブジェクトに

<meta name="xfire-service"/>

ですからね。。。w
ServiceDefはまだ実装してません。したいかもです。てか、やらないと?w


で、話は変わってはまりどころがあったので。


S2Axis2で、Listenerを使うときS2Servletをinitするタイミングが遅い(load-on-startupが2番目)ということもあり、listenerでContainerのオブジェクトが使えなかったり。

ってことで、S2XFire(仮)はXFireServletを継承したサーブレット一本とS2ServletContextListenerをペアで使うことにより、Listenerを使いたい場合にでも、2番目以降のListenerとして登録する形で回避しました。

具体的にweb.xmlを示すと

  <listener>
    <listener-class>
      org.seasar.framework.container.servlet.S2ServletContextListener
    </listener-class>
  </listener>

  (必要であればここにListenerを追加)

  <servlet>
    <servlet-name>XFireServlet</servlet-name>
    <display-name>XFire Servlet</display-name>
    <servlet-class>
    	(S2XFireServletのクラス)
    </servlet-class>
    <load-on-startup>1</load-on-startup> ← サービスの登録は最初にしておく。
  </servlet>

  <servlet-mapping>
    <servlet-name>XFireServlet</servlet-name>
    <url-pattern>/servlet/XFireServlet/*</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>XFireServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

な感じです。

まぁ即席対応なのでまだ不具合や不都合が発生するかも知れませんが。。。w


個人的な感想としては、XFireはなかなか使えそうな感じがします。

が、日本語だけでなく英語でも資料が少なすぎる。。。orz
この際だし、codehausのプロダクトメインで色々やってみようかな。apacheは普通に待ってたら出てくるだろうしねw


後、クライアントがC#なわけですが実感的に扱えるようになるのも利点。
Axis2だとサービスメソッドのオブジェクトが存在し、そいつのプロパティを設定して、サービスのメソッドの引数に渡さないといけなかったりします。
が、XFireだとサービスのメソッド呼び出しに引数をずらーっとならべてあげるだけ。普通のメソッド呼び出しと一緒ですね。

戻り値もそうです。
Axis2だとレスポンスオブジェクトから@returnで目的に到達できるのですが、XFireならそのまま目的オブジェクトが戻ってきます。


ここはWSDL生成の違いでしょうからSOAPの定義的にどっちが正しいかとかそういうこともあるのかも知れませんが。。。


まぁなんか歯切れ悪いですが以上ですwまた、何かエントリーするかも?