我正在部署一个EJB,它应该设置一个计时器并由它每24小时触发一次。但是我应该在哪里设置计时器? @PostConstruct
没有帮助 - 这是一个会话bean,因此在创建实际实例时将调用post-construct方法(这种情况永远不会发生,因为这个bean的唯一目的是跟踪计时器)。
有没有其他方法可以获得有关bean部署(而非实例化)的通知,以便在那里设置计时器?
由于
答案 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
- 标记的方法。我能够从那里设置一个计时器。