如何获取有关EJB部署的通知(设置计时器)?

时间:2009-10-15 12:16:13

标签: java ejb-3.0 ejb

我正在部署一个EJB,它应该设置一个计时器并由它每24小时触发一次。但是我应该在哪里设置计时器? @PostConstruct没有帮助 - 这是一个会话bean,因此在创建实际实例时将调用post-construct方法(这种情况永远不会发生,因为这个bean的唯一目的是跟踪计时器)。

有没有其他方法可以获得有关bean部署(而非实例化)的通知,以便在那里设置计时器?

由于

3 个答案:

答案 0 :(得分:5)

EJB 3.1引入了Singleton bean。它将在部署EJB时创建。

@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

答案 1 :(得分:3)

我认为最简单,最便携的解决方案是使用初始化ejb的上下文侦听器(contextInitialized event)向您的企业应用程序添加Web应用程序。

顺便说一下,这或多或少是Quartz Scheduler所做的(QuartzInitializerListener类)

答案 2 :(得分:1)

我发现的解决方案很丑陋,但与此问题的任何其他合法解决方案一样丑陋(例如来自@fvu的解决方案)。将@WebService注释应用于bean使JBoss在部署后立即实例化它(因为它需要构造bean的WSDL的方式),因此将调用@PostConstruct - 标记的方法。我能够从那里设置一个计时器。