S2XmlRpc

概要

XML-RPCをS2から利用するためのライブラリです。

S2XmlRpcを使うことにより、クライアントもサーバーも、XML-RPCをまったく意識することなく、 通常のJavaのメソッド呼び出しと同じ感覚で、クライアント/サーバー型の分散処理を記述できます。

サーバー

サーバー側でサービスを提供するクラスは以下のようになります。


  public interface Service {
    String hello();
  }
  
  public class ServiceImpl implement Service {
    String hello() {
      return "Hello, World!";
    }
  }

      

サーバー側のクラスはまったくのPOJOです。

このクラスをXML-RPCのサービスとして公開するために、web.xmlを以下のように設定します


<web-app>
    <servlet>
        <servlet-name>s2servlet</servlet-name>
        <servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class>
	<init-param>
	  <param-name>configPath</param-name>
	  <param-value>app.dicon</param-value>
	</init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet>
      <servlet-name>s2xmlrpc</servlet-name>
      <servlet-class>org.seasar.remoting.xmlrpc.XmlRpcServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>s2xmlrpc</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

      

また、app.diconには次のような設定をします。


<components>
  <component name="Service" class="ServiceImpl" />
</components>

      

XmlRpcServletにより、POJOがXML-RPCのサービスとして公開されます。

クライアント

クライアント側の処理の記述は以下のようなコードとなります。


  S2Container container = S2ContainerFactory.getContainer("app.dicon");
  Service service = (Service) container.getComponent(Service.class);
  System.out.println(service.hello());

      

上記のように、クライアントのコードにはXML-RPCに依存した記述は一切出てきません。

XML-RPCに依存する部分はすべてdiconファイルに集約されます。

diconファイルは以下のようになります。


<components>
  <component class="Service">
    <aspect>
      <component class="org.seasar.remoting.xmlrpc.XmlRpcInterceptor">
        <arg>"http://localhost:8080/S2XmlRpc/Service"</arg>
      </component>
    </aspect>
  </component>
</components>

      

XmlRpcInterceptorにより、Serviceインターフェースに対するメソッド呼び出しをXML-RPCプロトコルに変換し、 サービスを提供しているサーバーに送信します。

サーバーからの返信は、メソッドの戻り値としてクライアントに渡されます。