[Seasar-user:19457] Re: HOT deploy が有効なとき、新規に起動したスレッドから Dao 操作を行うと例外が発生

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2010年 3月 5日 (金) 18:00:00 JST


小林 (koichik) です.

Date:    Fri, 5 Mar 2010 16:49:24 +0900
From:    fjt ykhs <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:19454] HOT deploy が有効なとき、新規に起動したスレッドから Dao 操作を行うと例外が発生

> ■ 問題発生部分のコードイメージ
> □ Web 画面 (Teeda 使用) のボタンから呼ばれるコード
>         Thread t = new Thread(new OnBatchThread());
>         t.start();

生成されたスレッドで HOT deploy を有効に
するには,スレッドのコンテキストクラスローダを
HOT deploy 用のものにする必要があります.

また,HOT deploy はマルチスレッドに対応して
いないので,Web 側のスレッドと排他制御する
必要があります.
これらは通常 HotdeployFilter で行われます.

アプリが起動したスレッドでこれらを行うには,
OnBatchThread#run() の現在の内容を doRun() 
メソッドに移して,run() を

public void run() {
  if (HotdeployUtil.isHotdeploy()) {
    synchronized (HotdeployFilter.class) {
      HotdeployBehavior ondemand = (HotdeployBehavior) 
          S2ContainerBehavior.getProvider();
      ondemand.start();
      try {
        doRun();
      } finally {
        ondemand.stop();
      }
    }
  } else {
    doRun();
  }
}

のようにしてください.

また,アプリが起動したスレッドでは request や
session スコープのコンポーネントは利用できないので
注意してください.


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