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プロトコルに変換し、 サービスを提供しているサーバーに送信します。
サーバーからの返信は、メソッドの戻り値としてクライアントに渡されます。
