3

そのため、Glassfish 3.1 で Java EAR アプリケーションを実行しています。EJB モジュールで、注釈付きのタイマー関数を 1 つ持つステートレス セッション Bean を作成しました。正確なコードはありませんが、次のようになります。

@Stateless
public class SessionTimerBean {

    public SessionTimerBean(){
       System.out.println("Constructor Called");
    }

    @Schedule(second="*/10", minute="*", hour="*")
    public void scheduleTimer(final Timer t) {
       System.out.println("Timer Called");
    }
}

Glassfish を起動すると、デバッグ情報は、EJB タイマー アノテーションを認識し、Bean のコンストラクタ メソッドが起動時に呼び出されることを示しているようです。しかし、タイマー メソッド自体は、どの時点でもトリガーされないようです。

他の誰かがこの問題を抱えていますか? 私が見逃している他の設定はありますか?

前もって感謝します。

4

3 に答える 3

4

仕様によると、タイマーは慣例により永続的です。

タイマー サービスは、存続期間の長いビジネス プロセスのモデル化を目的としています。タイマーは、コンテナーのクラッシュ、サーバーのシャットダウン、およびそれらに登録されているエンタープライズ Bean のアクティブ化/パッシベーションおよびロード/ストアのサイクルに耐えます。これらの永続的な保証は、オプションでタイマーごとに無効にすることができます。

アクセルは、永続的な保証を無効にする方法を示しました。Glassfish サーバーは、タイマーを永続化するためにデフォルトのデータベースを使用します (こちらを参照してください)。稼働していないため、タイマーが機能しなかったと想像できました。次のコマンドを使用して開始します。

asadmin start-database
于 2012-11-07T14:23:13.443 に答える
4

以下の Timer コードは Glassfish 3.1.2 で動作します

import javax.ejb.Schedule;
import javax.ejb.Stateless;
import javax.ejb.Timer;

@Stateless
public class LabbBean {

    @Schedule(second="*/5", minute="*",hour="*", persistent=false)
    public void method123(final Timer timer) {
        System.out.println("Timer1234");
    }
}

しかし、削除すると動作しなくなりました

persistent=false 

サーバーログで私が見つけた:

INFO: keepstate is true and will not create new auto timers during deployment.

そこで、「keep-state」を false に変更しました。私はそれが何をするのか専門家ではありませんが、それを false に変更すると、persistent=false なしでタイマーが動作するようになりました

以下のファイルで変更しました

グラスフィッシュ-ejb.xml:

<glassfish-ejb-jar>
    <enterprise-beans>
    ...
    </enterprise-beans>
    <keep-state>false</keep-state>
</glassfish-ejb-jar>

glassfish-application.xml

<glassfish-application>
    <keep-state>false</keep-state>
</glassfish-application>
于 2012-10-27T18:13:49.873 に答える