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

B starlogic.jp Hidetoshi Hosokawa hoso
2003年 11月 12日 (水) 15:43:39 JST


ほそかわです。

On Thu, 6 Nov 2003 19:46:27 +0900
Yasuo Higa <[E-MAIL ADDRESS DELETED]> wrote:

> ひがです。
> > 
> > > ほそかわです。
> > > 
> > > 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を取得すれば大丈夫です。

早速やってみました。

実際に書いたコードはこのような感じです。

// 鯖A上のコード
SeasarContext ctx = SeasarContext.getInstance( "鯖B" );
BMBean b = (BMBean)MBeanProxy.create( BMBean.class, "mbean:name=b", ctx );

ですが、mbean:name=b が無いよ!と怒られてしまいました(T.T)
四苦八苦した末、Seasarのtestを見て、コードをパクったら動きました(笑)
これです→ JMXUtil.getMBeanName( "b" )

ついでに質問なのですが、Lifecycle.start()でMBeanを取得するとして、
一度取得したMBeanはキャッシュしてしまっても良いのでしょうか?
それともメソッドを呼ぶたびに、MBeanProxy.create()するのでしょうか?

以上、よろしくお願いします。
--
Hidetoshi Hosokawa < [E-MAIL ADDRESS DELETED] >






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