#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]] としてリリースされました.

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS