如何在部署时启动EJB计时器?

10

我需要创建一个间隔定时器,每周自动运行一次。我不想基于用户输入启动它,但我希望在应用部署到服务器时就创建它。我看到的每个示例都有另一个类启动定时器。 我不想使用消息驱动的bean来创建定时器,因为审计只需查询给定时间段的数据库而不是基于发送消息的操作。

我包含了一个定时器的示例。 在下面的示例中,定时器应该每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");
    }


}

那么有没有办法在部署应用程序时启动计时器? 我认为将计时器的创建放在@PostConstruct方法中并不是一个好主意,因为服务器上会有类加载器。

3个回答

25

如果你的项目可以使用 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");
}

通过使用新的@Schedule注释,您可以广泛控制超时方法将在何时以及多久调用一次。最大的优势是:您不再需要从外部"启动计时器"。

Oracle写道:

当包含注释为@Schedule或@Schedules的方法的企业bean部署时,EJB容器会创建自动计时器。企业bean可以具有多个自动超时方法,而编程计时器只允许一个在企业bean类中用@Timeout注释标注的方法。


回答你的另一个问题 - seafoxx

16

我过去处理定时器的方式是在web.xml中创建上下文监听器来配置定时器。

这样你就可以确保它在容器启动时开始工作,并在应用程序停止时干净地关闭。


1

我在 JBoss EAP 5.1 中发现了相同的问题。在调用上下文监听器时,EJB 不可访问。 - mekondelta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接