[Seasar-user:#] Re: [Seasar-user:181] Re: RMI の双方向呼び出しについて

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


<[E-MAIL ADDRESS DELETED]> の、
   "[Seasar-user:181] Re: RMI の双方向呼び出しについて" において、
   "Hidetoshi Hosokawa <[E-MAIL ADDRESS DELETED]>"さんは書きました:

ひがです。

> ほそかわです。
> 
> > > > 
> > > 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" )
> 
すまんこってす。MBean:name=bですね。
JMXUtil.getMBeanName( "b" )のほうがよりいいですね。

> ついでに質問なのですが、Lifecycle.start()でMBeanを取得するとして、
> 一度取得したMBeanはキャッシュしてしまっても良いのでしょうか?
> それともメソッドを呼ぶたびに、MBeanProxy.create()するのでしょうか?
> 
キャッシュして大丈夫です。
JNDIでルックアップして、取得しているのは、上記のようにしてつくった
MBeanProxyです。
---
Yasuo Higa <[E-MAIL ADDRESS DELETED]>
INFORMATION SERVICES INTERNATIONAL-DENTSU,LTD.




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