如何在部署时启动EJB Timer?

sch*_*ibk 10 java jboss java-ee ejb-3.0

我需要创建一个间隔计时器,设置为每周运行一次.我不希望它基于用户输入启动,但我希望在将应用程序部署到服务器时创建它.我见过的每个例子都有另一个类启动计时器.我不想使用消息驱动的bean来创建计时器,因为审计应该仅在给定时间段内查询数据库,而不是基于发送消息的操作.

我已经包含了一个Timer的例子.在下面的示例中,计时器应每10分钟触发一次.作为测试,我希望定时器每10分钟触发一次,这样我就可以测试定时器了.

@Stateless
public class TimerTest implements
        TimerTestLocal, TimerTestRemote{

    @Resource 
    private TimerService timerService;
    private Logger log = Logger.getLogger(TimerTest.class);
    private long interval = 1000 * 60 * 10;
    private static String TIMER_NAME = "AuditTimer";

    public void scheduleTimer() throws NamingException {
        // TODO Auto-generated method stub
        Calendar cal = Calendar.getInstance();
        //cal.set(Calendar.HOUR_OF_DAY, 23);//run at 11pm
        //cal.set(Calendar.MINUTE, 00);
        //cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm");
        log.debug("schedule for: " + sdf.format(cal.getTime()));

        timerService.createTimer(cal.getTime(), interval, TIMER_NAME);
    }

    public void cancelTimer() {
        for(Object obj : timerService.getTimers())
        {
            Timer timer = (Timer)obj;
            if(timer.getInfo().equals(TIMER_NAME))
                timer.cancel();
        }
    }

    @Timeout
    public void timerEvent(Timer timer) {
        log.debug("timer fired");
    }


}
Run Code Online (Sandbox Code Playgroud)

那么有什么办法可以在部署应用程序时启动这个计时器吗?由于服务器中的类加载器打开,我不认为将Timer的创建放在@PostConstruct方法中是个好主意.

sea*_*oxx 24

如果您的项目可以使用jee6/ejb3.1,则可以更好地解决此问题. http://docs.oracle.com/javaee/6/tutorial/doc/bnboy.html

@javax.ejb.Schedule(minute="*/10", hour="*")
public void automaticTimeout() {
    logger.info("Automatic timeout occured");
}
Run Code Online (Sandbox Code Playgroud)

通过使用新的@Schedule注释,您可以广泛控制调用超时方法的时间和频率.大的好处:你不再需要"从外面"启动计时器.

Oracle写道:

当部署包含使用@Schedule或@Schedules注释注释的方法的企业bean时,EJB容器会创建自动计时器.企业bean可以有多个自动超时方法,与程序计时器不同,后者只允许在企业bean类中使用@Timeout注释注释一个方法.


Jes*_*sse 16

我过去做过计时器的方法是在web.xml中创建一个上下文监听器来配置计时器.

这样,您可以确保它从容器启动,并在应用程序关闭时干净地关闭.