[VELOCITY-9] race condition時、(toolbox.xml形式で利用する場合に)TooManyRegistrationRuntimeExceptionが発生することがある Created: 2008-05-21  Updated: 2008-05-27  Resolved: 2008-05-27

Status: Resolved
Project: S2Velocity
Component/s: None
Affects Version/s: 1.2
Fix Version/s: 1.2.1

Type: Bug Priority: Critical
Reporter: tanigon Assignee: tanigon
Resolution: Fixed Votes: 0
Labels: None


 Description   

[Seasar-users:14329] より

うえしんさんご指摘ありがとうございます。

こんにちは。
うえしんです。

以前よく使わせていただいていて、ここしばらくは離れていたのですが、
久しぶりに更新されたということで試してみました。
やっぱりツールにコンポーネントがインジェクトされるのは便利です。

さて、早速で申し訳ありませんが、
(おそらく)applicationスコープ以外でtoolbox.xmlに登録されているツールで

org.seasar.framework.container.TooManyRegistrationRuntimeException

を発生する場合があることを確認しました。

具体的には

AutoRegisteringS2ServletToolInfo.javaの60行目(ツールのコンテナへの登録)

が複数回呼ばれる可能性があります。
(webapp起動直後にほぼ同時に複数のリクエストがあった場合など)
これにより、同名のコンテポーネントが複数回登録され、
TooManyRegistrationRuntimeExceptionを発生させることになります。
(Eclipseなどで50行目~60行目あたりでサスペンドさせると再現できます。)

回避策としましては、
60行目のregister前後をsynchronizedなどでブロックさせ、
再度 container.hasComponentDef で登録確認を行うなどが考えられると思います。

ご確認、よろしくお願いします。

手順:
 再現確認後、指摘行あたりを修正。
 雰囲気としては synchronizedなんじゃないかなあ、という思い。



 Comments   
Comment by tanigon [ 2008-05-27 ]

うえしんの指摘通り synchronizedして再度ifチェックすることにしました。
hasComponentDef() は true→falseになることがない かつ falseのケースは初回参照時のみ、ということで
synchronizedの影響を最小にするように一枚中でdouble-checkにしました

うえしんさんありがとうございます

Generated at Sat Apr 27 06:58:54 JST 2024 using Jira 9.15.0#9150000-sha1:9ead8528714127d8cfabf2446010d7e62c0a195c.