Seasar DI Container with AOP

S2RMI 基本的な使い方

本ドキュメントはS2RMI-1.0.1について記述しています.旧バージョンについては該当バージョンの配布ファイルに含まれているドキュメントを参照してください.

目次

ここではS2RMIに含まれるsrc/example以下の例を使って、S2RMIの使い方を説明します。 S2RMIはS2Containerに登録されているコンポーネントを簡単にリモートオブジェクト化します。 service.Helloインタフェースは普通のインタフェースです。 また、service.impl.HelloImplクラスはHelloインタフェースの実装クラス(POJO)です。 このHelloインタフェースとその実装クラスをS2RMIを使って、リモートオブジェクトとして公開します。

サービス

service.Hello.java

public interface Hello {
    public String say();
}

service.impl.HelloImpl.java

public class HelloImpl implements Hello {
    public String say() {
        return "Hello";
    }
}

サーバ側の設定

サーバ側の設定方法について説明します。サーバ側のdiconファイルに定義すべきコンポーネントは次の3つです。

  • org.seasar.remoting.rmi.adaptor.RMIAdaptorImpl
  • org.seasar.remoting.rmi.deployer.RMIAdaptorDeployer
  • service.impl.HelloImpl(リモートオブジェクトとして公開するインタフェースの実装クラス)
 RMIAdaptorImplクラスはComponentInvokerImplクラスを利用して、S2Containerに登録されているコンポーネントを呼び出すアダプタです。 RMIAdaptorDeployerはRMIAdaptorImplクラスをRMIレジストリに登録します。

server.dicon

<components>
  <component name="rmiAdapptor" class="org.seasar.remoting.rmi.adaptor.RMIAdaptorImpl">
    <property name="invoker">
      <component class="org.seasar.extension.component.impl.ComponentInvokerImpl"/>
    </property>
  </component>

  <component class="org.seasar.remoting.rmi.deployer.RMIAdaptorDeployer">
    <property name="adaptor">rmiAdapptor</property>
    <property name="registryPort">1108</property>
    <property name="servicePort">1109</property>
    <initMethod name="deploy"/>
  </component>

  <component name="hello" class="service.impl.HelloImpl"/>
</components>

RMIAdaptorDeployerのプロパティ

<property name="registryPort">
rmiregistry のポート番号。設定を省略するとデフォルトポート(1099)を使用します。
<property name="servicePort">
RMIAdaptorImplが使用するポート番号。設定を省略するとデフォルトポート(0)になり、匿名ポートが使用されます。

RMIAdaptorDeployerの起動

diconファイルに<initMethod name="deploy"/>を定義することにより、S2Containerを初期化することで、S2Container上のコンポーネントをリモート呼び出しできるようにします。 以下のServerMainクラスはその例です。

server.ServerMain.java

package server;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;
import org.seasar.remoting.common.deployer.Deployer;

public class ServerMain {
    public static void main(String[] args) {
        S2ContainerFactory.create("server/server.dicon").init();
    }
}

ServerMainを実行するには、パッケージ・エクスプローラーからServerMain.javaを選択し、右クリックから「実行」−「Javaアプリケーション」を行ってください。

クライアント側の設定

クライアント側の設定方法について説明します。クライアント側のdiconファイルに定義すべきコンポーネントは次の3つです。

  • org.seasar.remoting.rmi.connector.RMIConnector
  • org.seasar.remoting.common.interceptor.RemotingInterceptor
  • service.Hello(リモートオブジェクトとして呼び出すインタフェース)
 RMIConnectorクラスはRMIレジストリからRMIAdaptorImplクラスのスタブを取得し、サーバ側のコンポーネントを呼び出します。 RemotingInterceptorクラスはRMIConnectorを利用してリモートオブジェクトとして呼び出すインタフェース(Hello)にAOPとして設定します。 リモートオブジェクトを呼ぶ側と呼ばれる側のコンポーネント名称(hello)の定義は同じにする必要があります。

S2RMIはS2Remotingのひとつの実装であるため、RemotingInterceptorに設定するコネクタをS2RMIのRMIConnectorからS2Axisの org.seasar.remoting.axis.connector.AxisConnectorに変更することで、S2Axisによって公開されているリモートオブジェクトを呼び出すことができます。 S2Axisによるサーバ側の定義方法についてはこちらを参照して下さい。

clinet.dicon

<components>
  <component name="rmiConnector" class="org.seasar.remoting.rmi.connector.RMIConnector">
    <property name="baseURLAsString">"rmi://localhost:1108/"</property>
    <initMethod name="lookup"/>
  </component>

  <component name="remoting" class="org.seasar.remoting.common.interceptor.RemotingInterceptor">
    <property name="connector">rmiConnector</property>
  </component>

  <component name="hello" class="service.Hello">
    <aspect>remoting</aspect>
  </component>
</components>

リモートオブジェクトのメソッド呼び出し

クライアント側ではRemotingInterceptorをAOPとして定義したインタフェース(Hello)のメソッドを呼び出すと

Hello.say() -> RMIConnector -> RMIAdaptor -> ComponentInvoker -> HelloImpl.say()
という流れでリモート呼び出しを行います。以下のClientMainクラスはその例です。

client.ClientMain.java

package client;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;
import service.Hello;

public class ClientMain {
    public static void main(String[] args) {
        S2Container container = S2ContainerFactory
                .create("client/client.dicon");
        container.init();
        Hello hello = (Hello) container
                .getComponent(service.Hello.class);

        System.out.println(hello.say());
    }
}

ClientMainを実行するには、パッケージ・エクスプローラーからClientMain.javaを選択し、右クリックから「実行」−「Javaアプリケーション」を行ってください。