[Seasar-user:19140] Re: S2JMS コンテナ起動完了前にJMSContainerImpl#invokeMessageListenersが呼ばれる?

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2010年 1月 16日 (土) 22:00:00 JST


小林 (koichik) です.

Date:    Sat, 16 Jan 2010 20:38:16 +0900
From:    nari <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:19139] S2JMS コンテナ起動完了前にJMSContainerImpl#invokeMessageListenersが呼ばれる?

> 発生状況としては、queueに数件ほどメッセージが溜まっている状態でS2JMSサーバを起動した際に発生します。
> 
> コンテナ起動中、リソースアダプタが有効→受信スレッドが走りだす→コンテナが起動する前にQueueからメッセージを取得し、
> リスナのComponent定義がまだ無い状態で、JMSContainerImplがリスナインスタンスを作成しようとしているのかな〜と想像しています。

COOL deploy または AutoRegister を使っているなら
その可能性が高いですね.

COOL deploy の場合,app.dicon の最後の
インクルードとして

<include path="cooldeploy-autoregister.dicon"/>

と書いたのと同じになります.
このため,jms.dicon の初期化が終わった後に
コンポーネントの自動登録が行われることになります.

回避策としてはちょっと場当たり的ですが,
app.dicon で jms.dicon より先に
cooldeploy-autoregister.dicon を明示的に
インクルードしてみてください.
あまり早くインクルードするとよろしくないので,

<include condition="#ENV != 'ut' and #ENV != 'ct'" path="cooldeploy-autoregister.dicon"/>
<include path="jms.dicon"/>

が app.dicon のインクルードの最後になるように
するのが無難です.
こうすると,jms.dicon の初期化が始まる前に
COOL deploy による自動登録が行われます.

抜本的な対策としては ResourceAdapterDeployer が
アノテーションで勝手に開始するようになっているのを
やめて,dicon でタイミングを制御できるように
するべきかなと.

そうすれば app.dicon の最後の方で

  <initMethod>
    raDeployer.start()
  </initMethod>

とか書くことで問題を回避できるので.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



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