[Seasar-user:11090] S2RMIを用いたコールバック登録

歌舞伎モモ [E-MAIL ADDRESS DELETED]
2007年 10月 18日 (木) 12:30:46 JST


歌舞伎モモと申します。

よろしくお願いします。

S2RMIを用いず、RMIの場合は、
http://www.ryerson.ca/~dgrimsha/courses/cps841/RMICallbacks.html
を参考にしながら、コールバックオブジェクト(リモートオブジェクト)は、
UnicastRemoteObjectを継承したクラスとして用意し、
複数クライアントから見て、共有情報とさせるため、
フィールド(Vector)を定義し、実現させました。

ただ、同様に、S2RMIで行うとなぜか、コールバックオブジェクトの共有がうま
くいきません。

失礼ですが、
以下より、ソースを貼り付けます。


======= SERVER SIDE ========

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

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

@ServiceImpl.java
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());
    }
}

-----------------------------------
server側設定ファイル(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 =====

@ClientMain.java
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側設定ファイル(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>


ServerMainを起動した状態で、ClientMainを複数プロセス起動したところ、
共有対象としたリモートオブジェクトのフィールドVectorのサイズが、
常に「0」となり、コールバック登録(entryCallBackObj())を行うので、
結果として、Vectorオブジェクトのサイズが、「1」となります。

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

こちらの勉強不足な点もあるかもしれませんが、宜しくお願いいたします。

以上です。
--------------------------------------
Easy + Joy + Powerful = Yahoo! Bookmarks x Toolbar
http://pr.mail.yahoo.co.jp/toolbar/




Seasar-user メーリングリストの案内