読者です 読者をやめる 読者になる 読者になる

S2Remoting実装トライアル(その2)

S2

引き続き、Connector。まずはインタフェースから。

2. Connector

ふたたび、ひがさんのblogから引用すると、

ConnectorAdviceはConnectorに対し、コンポーネントの名前、メソッド名、引数を 渡して処理してもらいます。

ConnectorはAdaptorに対し、コンポーネントの名前、メソッド名、引数を 渡して処理してもらいます。

という訳で、こんな感じ。

package sample.seasar.remoting;

import org.seasar.framework.beans.MethodNotFoundRuntimeException;

/**
 * @author murata
 */
public interface Connector
{
  public Object invoke(String tagetName, String methodName, Object[] args)
      throws MethodNotFoundRuntimeException;
}

続いて、実装クラスに行きたいところですが、Adaptorが関係してくるので、
次はAdaptorインタフェース。

3. Adaptor

package sample.seasar.remoting;

/**
 * @author murata
 */
public interface Adaptor
{
  public Object invoke(String targetName, String methodName, Object[] args)
      throws MethodNotFoundRuntimeException;
}

Connectorと全く同じになってしまいました。。。

しかし、このAdaptorのinvokeメソッドはリモートメソッドになるはずなので、次のようにしてみる。

package sample.seasar.remoting;

import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 * @author murata
 */
public interface RmiAdaptor extends Remote
{
  public Object invoke(String targetName, String methodName, Object[] args)
      throws RemoteException;
}

名称はAdaptorでも良さそうですが、RMIではない実装もあるはずなので、RmiAdaptorとしておきます。

では続いて、Connectorの実装クラスにトライ。

4. ConnectorImpl

ひがさんのクライアント側ダイコン定義を見ると、
addURLメソッドで複数の呼び出し先を登録することでクラスタリング可能とありますが、
まずはシンプルに書いてみます。

package sample.seasar.remoting.impl;

import java.rmi.Naming;
import java.rmi.RMISecurityManager;

import org.seasar.framework.beans.MethodNotFoundRuntimeException;

import sample.seasar.remoting.Connector;
import sample.seasar.remoting.RmiAdaptor;

/**
 * @author murata
 */
public class RmiConnectorImpl implements Connector
{
  private RmiAdaptor adaptor;

  public void addURL(String url)
  {
    try
    {
      if (System.getSecurityManager() == null)
      {
        System.setSecurityManager(new RMISecurityManager());
      }

      this.adaptor = (RmiAdaptor) Naming.lookup(url);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }

  /*
   * (non-Javadoc)
   * 
   * @see org.seasar.remoting.Connector#invoke(java.lang.String,
   *      java.lang.String, java.lang.Object[])
   */
  public Object invoke(String targetName, String methodName, Object[] args)
      throws MethodNotFoundRuntimeException
  {
    try
    {
      return this.adaptor.invoke(targetName, methodName, args);
    }
    catch (Exception e)
    {
      throw new MethodNotFoundRuntimeException(this.adaptor.getClass(),
          methodName, args);
    }
  }
}

う〜む。シンプルというよりは例外処理を考慮していない恥ずかしい実装ではありますが。。。
とりあえず、まずは動くものを作ってしまいましょう。>自分