Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

S2RMIを用いたコールバック登録

RMIの場合は、
http://cse.spsu.edu/pbobbie/Summer_2004/Chp8-RMIAdvanced.ppt

(リモートオブジェクト)コールバックオブジェクトをUnicastRemoteObjectを継承したクラスのオブジェクトのフィールドに持たし(Vector)、共有を実現できました。

同様に、S2RMIで行うとなぜか、対象のオブジェクトの共有がうまくいきません。


======= SERVER SIDE ========
public class ServerMain {
    
    public static void main(String[] args) {
        S2Container container = S2ContainerFactory.create("server.dicon");
        container.init();
    }
}


public class ServiceImpl extends UnicastRemoteObject implements Service {
    
    private static final long serialVersionUID = -5960260125251941419L;

    public static Vector<NoticeReception> vec = null;

        
    public ServiceImpl() throws RemoteException {
        super();
        this.vec = new Vector<NoticeReception>();
        System.out.println("AAAAAAAAAAA");
        
    }
    
    public void notice(String message) {
        System.out.println("aaaaaa" + vec.size());
    }

    public void entryCallBackObj(String name, NoticeReception callBackObj) {

        vec.addElement(callBackObj);
        System.out.println("aaaaaa" + vec.size());
    }
}

public interface Service {
    public void notice(String message) throws RemoteException;
    public void entryCallBackObj(String name, NoticeReception callBackObj)throws RemoteException;
    
}

設定ファイル(server.dicon)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
  "http://www.seasar.org/dtd/components24.dtd">
<components xmlns:xi="http://www.w3.org/2001/XInclude">
 
  <component name="Service"
      class="server.ServiceImpl"/>
 
  <component name="componentInvoker"
      class="org.seasar.extension.component.impl.ComponentInvokerImpl"/>

  <component name="RMIAdapptor"
      class="org.seasar.remoting.rmi.adaptor.impl.RMIAdaptorImpl">
    <property name="invokerName">"componentInvoker"</property>
  </component>

  <component class="org.seasar.remoting.rmi.deployer.impl.RMIAdaptorDeployerImpl">
    <property name="registryPort">1108</property>
    <property name="servicePort">1109</property>
    <initMethod name="deploy"/>
    <destroyMethod name="undeploy"/>
  </component>

  <component class="org.seasar.remoting.rmi.filter.impl.RMIExternalContextFilter"/>
</components>


===== CLIENT SIDE =====
public class ClientMain {

    /**
     * @param args
     */
    public static void main(String[] args) {

        ClientMain client = new ClientMain();
        client.doTask();
        

    }
    public void doTask() {

        S2Container container = S2ContainerFactory.create("client.dicon");
        container.init();

        Service service = (Service) container.getComponent("Service");

        NoticeReception callBackObj = new NoticeReceptionClinetAImpl();

        try {
            UnicastRemoteObject.exportObject(callBackObj);
            service.entryCallBackObj("ClientA", callBackObj);            
        }
        catch (RemoteException ex)
        {
            ex.printStackTrace();
        }    

        while(true) {
            try {
                System.out.println("ClientA is sleeping");
                Thread.sleep(10000);
            } catch (Exception e)
            {
                e.printStackTrace();
            }    
        }
        
    }
}

設定ファイル(client.dicon)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
  "http://www.seasar.org/dtd/components24.dtd">
<components>
  <component name="Service"
      class="server.ServiceImpl">
    <aspect>remotingInterceptor</aspect>
  </component>

  <component name="remotingInterceptor"
      class="org.seasar.remoting.common.interceptor.RemotingInterceptor"/>

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


クライアントを複数実行しても、共有を対象としてオブジェクトのフィールドVectorのサイズが、常に0となります。コールバック登録を行うので、結果としてサイズは、1となります。

クライアントの設定が悪いのかと危惧しておりますが、どなたか詳細をご存知な方いらっしゃいましたら、ご教授願います。すいません。

1

回答

3085

閲覧

1件の回答

評価

0

自己解決しました。

ただのdiconファイルの設定ミスでした。
あと、S2RMIは、RMIのリモートオブジェクトとして実装する必要はないのですね。勉強になりました。
http://ml.seasar.org/archives/seasar-user/2007-October/013004.html

サンプルは配布しております。
http://kabuki.buzama.com/ の【downloads】へ

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。