石橋です。お疲れ様です。
時間があいてしまい、申し訳ありません。
お教えいただいた方法などを使って色々試してみた結果、どうやら状況が改善しました。
interval1時間で、今のところ停止していません。
SessionBeanに直接Timerへの参照を持っていた事が間違っていたようなので、これを
修正したところ、Timerが停止しなくなったようです。
(これが直接の原因である証拠はありませんが、他に直したところもないので・・・)
新しいコードです。
public void startTimer(Date startdate, long interval ){
Collection<Timer> timers = timerService.getTimers();
for(Timer t : timers){
if("ActionTimer".equals(t.getInfo())) t.cancel();
}
if(interval!=0){
timerService.createTimer(startdate, interval, "ActionTimer");
System.out.println("**** TIMER STARTED AT " + new Date());
}
}
//getTimer()は廃止
public boolean actiontimerIsAlive(){
Collection<Timer> timers = timerService.getTimers();
for(Timer t :timers){
if("ActionTimer".equals(t.getInfo())) return true;
}
return false;
}
//handleTimeoutは同じ
石橋 和洋 さんは書きました:
> お疲れ様です。石橋です。
>
> いろいろそちらでも調査頂いている様で、本当にありがとうございます。
>
> 私も調査をしていますが、なかなか本筋にたどり着けずにいます。
> ためしにNetBeansのプロファイルなども使ってみましたが、よく分かりませんでした。
>
> 今、試しにSessionBeanの@PreDestroyでログ出力させて、タイマーが動かなくなる時間との
> 関連を見てみたのですが、確かにSessionBeanの破棄とTimerの停止はあまり
> 関係なさそうです。
>
> 今、glassfishの管理画面を見ていて気がついたのですが、
>
> Configuration>EJB Container>EJB Timer Service
> というタグがあり、少し弄って見ようと思います。
>
>
>
> Shinya Ogino さんは書きました:
>> お疲れさまです。
>>
>> 助けになっておらずすみません。
>> ご存じかとは思いますが、管理コンソールで、
>>
>> 設定 > EJB コンテナ
>>
>> からプールの設定を変更することができます。また、
>>
>> 設定 > 監視
>>
>> にて EJB コンテナの監視レベルを例えば HIGH と設定しておくと、
>>
>> アプリケーションサーバー > 監視 > アプリケーション
>>
>> からご自身のアプリケーションの EJB の生成/破棄などの統計を
>> 見ることができます。念のため試しましたが、セッションビーンの
>> 生成/破棄が繰り返されても Timer の通知は継続してました。
>>
>> 以上、調査の助けになれば。
>>
>> 荻布
>>
>> 石橋 和洋 wrote:
>>> 石橋です。お疲れ様です。
>>>
>>> テストプログラムを作成して動かしたところ、特にTimerが落ちる問題は発生しませんでした。
>>> Timer周りのコードは殆ど同じなんですが・・・
>>>
>>> よく考えると、落ちるとtimerがnullになってしまっているという事は、別人が勝手にnullに書き換える
>>> 事はありえないんで(privateメンバですし)、StatelessSessionBeanインスタンスが別のものになって
>>> しまっている可能性が高いように思います。
>>>
>>> 以下想像ですが、
>>> Timer用のSessionBeanだけだと何も起きない事から考えると、他にいろいろなBeanが存在する状況でのみ
>>> 発生するように思えます。
>>> メモリの利用のせいなのか、スレッドプールの利用のせいなのかわかりませんが、それらの理由で
>>> SessionBeanが一旦消え、別のSessionBeanに切り替わった段階でエラーになる・・・のではないでしょうか。
>>>
>>> 10分というのは、きっとSessinBeanが死ぬまでの期間なんでしょうか。
>>> 本来は、TimerはSessionBeanと関係なく生き続けるはず・・・ですよね。
>>>
>>>
>>> 石橋 和洋 さんは書きました:
>>>> こんばんわ。
>>>> 石橋です。
>>>>
>>>> コメントアウトされているほうでも、発生しています。
>>>>
>>>> 今テストプログラム作成中です。。。
>>>> 少々おまちください。
>>>>
>>>>
>>>> Shinya Ogino さんは書きました:
>>>>> どうもありがとうございます。
>>>>>
>>>>> コメントアウトされている方の handleTimeout でも現象は起きますか?
>>>>>
>>>>>> (再現するためのプログラムという事は、アプリの部分ではなく、再現するための
>>>>>> 最小セットを作らないといけないと言う事ですよね・・・そちらも少しおまちを)
>>>>> 仮に GlassFish のバグとして報告することになった場合にも
>>>>> あると良いのでできればよろしくお願いします。
>>>>>
>>>>> 荻布
>>>>>
>>>>> 石橋 和洋 wrote:
>>>>>> 荻布さま。こんばんわ。
>>>>>> 早速のご返事ありがとうございます。
>>>>>>
>>>>>> 再現されませんか・・・ということはコードの問題なんでしょうか。
>>>>>>
>>>>>> ログにはなにも出力されていないようです。
>>>>>> server.logですが、現象が何時起きるのか監視が難しいのですが取ってみます。
>>>>>>
>>>>>>
>>>>>> コードは以下のとおりです。不足ありましたらご指摘ください。
>>>>>> (極力元のまま貼り付けます)
>>>>>> (再現するためのプログラムという事は、アプリの部分ではなく、再現するための
>>>>>> 最小セットを作らないといけないと言う事ですよね・・・そちらも少しおまちを)
>>>>>>
>>>>>> -------------------------------
>>>>>> @Stateless
>>>>>> public class ActionFacadeBean implements ActionFacade{
>>>>>>
>>>>>> @Resource
>>>>>> private TimerService timerService;
>>>>>>
>>>>>> private Timer timer = null;
>>>>>>
>>>>>> public void startTimer(Date startdate, long interval ){
>>>>>> Collection<Timer> timers = timerService.getTimers();
>>>>>> for(Timer t : timers) t.cancel();
>>>>>> if(interval==0){
>>>>>> timer = null;
>>>>>> return;
>>>>>> }
>>>>>> timer = timerService.createTimer(startdate, interval, null);
>>>>>> System.out.println("**** TIMER STARTED AT " + new Date());
>>>>>>
>>>>>> }
>>>>>> public Timer getTimer(){
>>>>>> return timer;
>>>>>> }
>>>>>>
>>>>>> /**
>>>>>> * アクションタイマーが実行されたときに、実行するメソッド。
>>>>>> *
>>>>>> * @param timer
>>>>>> */
>>>>>> @Timeout
>>>>>>
>>>>>> public void handleTimeout(Timer timer){
>>>>>> try{
>>>>>> Collection<TimerAction> actions = em.createNamedQuery("findTimerAction").getResultList();
>>>>>> for(TimerAction a : actions){
>>>>>> System.out.println("************実行中のタイマーアクション:"+
>>>>>> a.getId());
>>>>>> Collection<Apply> applies =
>>>>>> applyfacade.findApplyByStatus(a.getStatus());
>>>>>> a.fireAll(applies);
>>>>>> }
>>>>>> }catch(Throwable e){
>>>>>> System.out.println("************アクションタイマーの実行中にエラーが
>>>>>> 発生しました。");
>>>>>> e.printStackTrace();
>>>>>> }
>>>>>> }
>>>>>> /*
>>>>>> public void handleTimeout(Timer time){
>>>>>> System.out.println("*************TIMER WORK AT "+new Date());
>>>>>> }*/
>>>>>> -----------------------------
>>>>>>
>>>>>>
>>>>>>
>>>>>> Shinya Ogino さんは書きました:
>>>>>>> 石橋さん、こんにちは。
>>>>>>>
>>>>>>> 少し試してみたのですが、こちらで再現できていません。
>>>>>>> 下記、連絡頂くことはできますか?
>>>>>>> - エラーなどがログに出力されていたらその内容
>>>>>>> domains/ドメイン/logs/server.log
>>>>>>> - 再現するためのプログラム
>>>>>>>
>>>>>>> 荻布
>>>>>>>
>>>>>>> 石橋 和洋 wrote:
>>>>>>>> お世話になります。石橋といいます。
>>>>>>>>
>>>>>>>> 最近本MLに加入しました。既メンバーの皆様、よろしくお願いします。
>>>>>>>>
>>>>>>>> 早速ですが、glassfishについて質問があります。
>>>>>>>> ご存知の方がおられましたらお教えいただきたいと思います。
>>>>>>>>
>>>>>>>> 製品のバージョン:
>>>>>>>> glassfish v2.1
>>>>>>>>
>>>>>>>> 質問の内容:
>>>>>>>> glassfishのTimerServiceを利用しているのですが、Intervalをきっかり600秒以上に
>>>>>>>> すると、2時間ほどでTimerが落ちてしまいます。600秒だと落ちずにずっと
>>>>>>>> 動き続けています。
>>>>>>>> これは、glassfishの仕様なのでしょうか?
>>>>>>>> 制限を解除するような設定などはないのでしょうか?
>>>>>>>>
>>>>>>>> よろしくお願いします。
>>
>