[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 メーリングリストの案内