[Seasar-user:180] Re: RMI $B$NAPJ}8~8F$S=P$7$K$D$$$F(B

B isid.co.jp Yasuo Higa higa
2003年 11月 12日 (水) 15:43:39 JST


ひがです。
> 
> > ほそかわです。
> > 
> > remoteNotificationListenerで詰まっています。
> > 
> > やりたいことは、別々のマシン上で動く2つのSeasar間で、
> > RMIの双方向通信を行いたいのです。
> > 
> > やりたいことのイメージはこんなです。
> > *) 鯖A(Seasar1) と 鯖B(Seasar2)があります。
> > 1) 鯖AはRMIで鯖BのMBeanを呼び出します。
> > 2) 鯖Bは、1)の呼び出しの返答を鯖Aに送りたいとします。
> > 3) 鯖BはRMIで鯖AのMBeanを呼び出します。
> > 
> > なのですが鯖AのSeasarは、鯖BのSeasarが起動していないとRMIの通信ができず、
> > 鯖BのSeasarは鯖AのSeasarが起動していないとRMI通信できません(T_T)
> > 
> > Seasar起動時に出るエラーはこんなです。
> > org.seasar.util.SeasarException: 
> > [ESSR0017]Exception occurred, because java.net.
> > ConnectException: Connection refused: connect
> > 
> > それはそうだよな…って感じなのですが、
> > RMIを使って双方向通信する方法は無いでしょうか?
> > 
> MBeanProxyを使えばできます。
> 鯖Aが起動している状態で、
> A a = new A();
> JMXService.registerMBean(a, "mbean:name=A");
> BMBean b = (BMBean) MBeanProxy.create(BMBean.class, "mbean:name=B",
>   鯖BのSeasarContext);
> a.setB(b);
> 
> 鯖Bが起動している状態で、
> B b = new B();
> JMXService.registerMBean(b, "mbean:name=B");
> AMBean a = (AMBean) MBeanProxy.create(AMBean.class, "mbean:name=A",
>   鯖AのSeasarContext);
> b.setA(a);
> 
> とやれば、お互いに通信できると思います。

こんな面倒なことしなくても、A,BがLifecycleをimplementsして、
Aのstart()で、
BMBean b = (BMBean) MBeanProxy.create(BMBean.class, "mbean:name=B",
   鯖BのSeasarContext);

Bのstart()で、
AMBean a = (AMBean) MBeanProxy.create(AMBean.class, "mbean:name=A",
   鯖AのSeasarContext);

のように相手のProxyを取得すれば大丈夫です。
---
Yasuo Higa <[E-MAIL ADDRESS DELETED]>
INFORMATION SERVICES INTERNATIONAL-DENTSU,LTD.




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