2

私が取り組んでいる JSF-2 アプリケーションでは、ユーザーがアクションを実行したときにサーバー側のタイマーを開始する必要があります。
このタイマーは、アプリケーション自体に関連している必要があるため、ユーザー セッションが閉じられても存続する必要があります。
この問題を解決するために、java.util.Timer クラスを使用して、Application スコープの Bean でタイマー オブジェクトをインスタンス化することを考えました。
それは良い解決策になるでしょうか?これを達成するための他のより良い方法はありますか? ありがとう

4

1 に答える 1

3

EJB コンテナなし

コンテナーに ejb 機能 (tomcat、jetty など) がない場合は、Quartz スケジューラー ライブラリを使用できます: http://quartz-scheduler.org/

また、いくつかの優れたコード サンプルもあります: http://quartz-scheduler.org/documentation/quartz-2.1.x/examples/Example1

EJB 3.1

アプリケーション サーバーに EJB 3.1 (glassfish、Jboss) がある場合、タイマーを作成する Java ee 標準の方法があります。主に @Schedule および @Timeout アノテーションを調べます。

このようなものはあなたのユースケースをカバーするかもしれません(タイマーが切れると@Timeoutアノテーションが付けられたメソッドが呼び出されます)

import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerConfig;
import javax.ejb.TimerService;

@Stateless
public class TimerBean {
    @Resource
    protected TimerService timerService;

    @Timeout
    public void timeoutHandler(Timer timer) {
        String name = timer.getInfo().toString();
        System.out.println("Timer name=" + name);
    }

    public void startTimer(long initialExpiration, long interval, String name){      
        TimerConfig config = new TimerConfig();
        config.setInfo(name);
        config.setPersistent(false);
        timerService.createIntervalTimer(initialExpiration, interval, config);
    }
}
于 2012-12-07T12:38:13.397 に答える