#contents *S2RMI [#heab1c9f] **概要 [#c57972c8] S2RMIはS2RemotingのRMIによる実装です。 S2RMIを使うと、異なるJavaVM上のS2Containerに定義されているコンポーネント(POJO)を簡単に(透過的に)呼び出すことができます。 ***セットアップ [#ba735895] -前提条件 |S2RMI|S2|S2Remoting| |1.0.0|2.1.11|0.0.7〜| -実行環境 S2RMIを実行するには、以下のものが必要です。 --JDK (J2SE SDK) 1.4以降が必要です。S2RMI-V1.0.0の開発とテストはJDK 1.4.2_08で行っています。 --S2の2.1.11以降が必要です(J2SE5.0ではS2.2以降が必要です)。S2RMI-V1.0.0の開発とテストはS2.2.7で行っています。 --S2Remotingの0.0.7以降が必要です.S2RMI-V1.0.0の開発とテストはS2Remoting1.0.0で行っています。 -開発環境 S2RMIのディストリビューションは、他のS2関連プロダクトの多くと同様、Eclipse Javaプロジェクトをアーカイブしたものとなっています。 --Eclipse3.0以降が必要です。 --S2の2.1.11以降が必要です。 -ダウンロード S2RMIは本ページからダウンロードすることができます。 -インストール 事前にS2およびS2RemotingがEclipseワークスペースにインポートされている必要があります。 --ダウンロードしたS2RMI-Vx.y.z.zipファイルを適当なディレクトリに解凍してください。 --Eclipseを起動し、「ファイル」−「インポート」メニューを選択してください。 --「インポート」ウィザードで「既存プロジェクトをワークスペースへ」を選択し、「次へ」をクリックしてください。 --「参照」ボタンをクリックし、解凍したディレクトリにできているs2-rmiディレクトリを選択し、「OK」ボタンをクリックします。 --「終了」ボタンをクリックします。 ***基本的な使い方 [#ba735895] ここではS2RMIに含まれるsrc/example以下の例を使って、S2RMIの使い方を説明します。 S2RMIはS2Containerに登録されているコンポーネントを簡単にリモートオブジェクト化します。 service.Helloインタフェースは普通のインタフェースです。また、service.impl.HelloImplクラスはHelloインタフェースの実装クラス(POJO)です。このHelloインタフェースとその実装クラスをS2RMIを使って、リモートオブジェクトとして公開します。 -サービス --Hello.java public interface Hello { public String say(); } --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="adaptor"> rmiregistry のポート番号。設定を省略するとデフォルトポート(1099)を使用します。 ---<property name="servicePort"> RMIAdaptorImplが使用するポート番号。設定を省略するとデフォルトポート(0)になり、匿名ポートが使用されます。 ---<initMethod name="addCustomSocketFactory"> カスタム RMI ソケットファクトリを使用する場合は呼び出して下さい。 --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(); } } -クライアント側の設定 クライアント側の設定方法について説明します。クライアント側の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="baseURL">new java.net.URL("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()); } } ***カスタム RMI ソケットファクトリの設定 [#ba735895] RMIAdaptorDeployerにはRMIClientSocketFactory、RMIServerSocketFactoryの実装クラスを設定することができます。 -RMIAdaptorDeployerの詳細定義 <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"/> <initMethod name="addCustomSocketFactory"> <arg> <component class="server.rmisocfac.XorClientSocketFactory"> <arg>0xAC</arg> </component> </arg> <arg> <component class="server.rmisocfac.XorServerSocketFactory"> <arg>0xAC</arg> </component> </arg> </initMethod> </component> **開発者 [#peb7c33a] Kenichiro Murata(http://d.hatena.ne.jp/KenichiroMurata/) **リリース情報 [#scaf8063] ***1.0.0-RC2 (2005/05/09) [#x31d4ccb] -examplesをS2RMIに梱包しました。 -mavenを使用しなくても外部ビルダとしてantのbuild.xmlからrmicを実行するように変更しました。 -RMIAdaptorDeployerにてロギングのカード条件によって、registry.rebind()が呼ばれない場合がある点を修正しました。 -testcase内のソースに含まれていた不要なフィールドを削除しました。 ***1.0.0-RC1 (2005/05/05) [#x31d4ccb] -Mavenに対応しました。 -JavaDocを記述し、生成しました。 -Seasar 2.2.7に対応しました。 -S2Remoting 1.0.0に対応しました。 ***0.2.0 (2005/02/06) [#x31d4ccb] -ComponentInvokerがS2.1.11に取り込まれたことに対応しました。 -S2Remoting 0.0.7に対応しました。 -カスタム RMI ソケットファクトリを設定できるようにしました。 ***0.1.0 (2005/01/14) [#x31d4ccb] -新規リリース。 **ダウンロード [#e0441bab] &ref(S2RMI-V1.0.0-RC2.zip);~ **コメント [#c8668c23] #pcomment(Comment/Sandbox/S2RMI,10,reply) S2RMI は Sandbox を卒業して [[S2 プロダクト>http://www.seasar.org/products.html]] としてリリースされました.