2009-10-15 13 views
9

私はタイマを設定し、24時間ごとにそれによってトリガされるべきEJBをデプロイしています。しかし、タイマーはどこに設定すべきですか? @PostConstructは役に立ちません - これはセッションBeanですので、実際のインスタンスが作成されるとポストコンストラクトメソッドが呼び出されます(このBeanの唯一の目的はタイマーを追跡するためではありません)。EJBデプロイメント(タイマーの設定)に関する通知を受け取る方法は?

ここにタイマーを設定するためにBeanのデプロイメント(インスタンス化ではない)に関する通知を受け取る方法はありますか?

おかげ

答えて

1

私が見つけた解決策は醜いですが、この問題への任意の他の法的解決策と同じように醜い(から例えばソリューション@fvu)。 Beanに@WebServiceアノテーションを適用すると、JBossはデプロイ直後にインスタンス化します(BeanのWSDLを構築する方法が必要なため)。@PostConstruct -markedメソッドが呼び出されます。そこからタイマーを設定することができました。

3

私が最も簡単でポータブルソリューションは、EJBを初期化し、コンテキストリスナー(contextInitialized event)を使用して、エンタープライズ・アプリケーションにWebアプリケーションを追加することであると思います。ところで

、それはクォーツスケジューラが同様に何(クラスQuartzInitializerListener)多かれ少なかれだ

5

EJB 3.1では、Singleton beanが導入されています。これは、EJBのdeplyomentで作成されます。

@Singleton 
@Startup 
public class TimerSessionBean { 

    @Resource 
    TimerService timerService; 

    @PostConstruct 
    public void startTimer() { 
     Logger.getLogger(getClass().getName()).log(Level.INFO, 
       timerService.getTimers().size() + " timers running"); 

     Logger.getLogger(getClass().getName()).log(Level.INFO, "create a timer"); 

     timerService.createTimer(10000, 10000, "a timer"); 
    } 

    @Timeout 
    void doSomething(Timer timer) { 
     System.out.println("something"); 
    } 
} 

定期的にタスクを実行するために使用することができますEJB 3.1のもう一つの新機能はSchedule annotationです。

関連する問題