EJB 3.0 TimerService - 在每个月的第1天运行计时器

时间:2011-12-28 05:32:57

标签: java java-ee timer timeout ejb-3.0

在EJB 3.0 TimerService.createTimer(initialDuration, intervalDuration, TimerID)方法中,只接受initialDurationintervalDuration个参数。

问题是我想在每个月的第1天运行计时器,我不能像在EJB 3.1 TimerService中那样使用cron表达式设置我的计时器。
一些解决方法就像在每日基础上运行并检查@Timeout方法中的日期,如果它是'月的第一个',但这是不合适的方式。

我在线浏览了许多示例/教程,但没有运气。有没有其他方法可以实现这种情况?

2 个答案:

答案 0 :(得分:3)

我建议采用以下方法:

  • @Timeout方法中,使用JodaTime计算下一个时间点。因此,每个计时器都会使用@Timeout方法调度下一个调用。这样做的好处是,您可以构建一个管理对话框,该对话框提供系统中预定计时器的概述,如果您每天只运行计时器,则无法执行此操作。我使用它来实现一个相当复杂的,用户可配置的计时器配置(Outlook样式,即“在上午9:00在第三个每两个月运行一次)。即使使用JodaTime,我最终编写了大量代码,但是,在你的情况下它不应该那么复杂。基本上就像
  

timerService.createTimer( new DateTime( System.currentTimeMillis()).plusMonths(1).withTimeAtStartOfDay().toDate(), null );

  • 放弃TimerService并直接使用Quartz进行调度。然后,您可以将cron表达式直接提供给API。 Quartz通常与Java EE很好地集成,即使在复杂的集群环境中也是如此。

答案 1 :(得分:2)

    try {
        Scheduler scheduler;
        scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.start();

        JobDetail job = new JobDetail("job name", "job group", (your class which will implement job interface).class);
        CronTrigger trigger = new CronTrigger("trigger name", "trigger group", "0 0 0 1 * ?");
        scheduler.scheduleJob(job, trigger);
    } catch (Exception e) {
        e.printStackTrace();
    }

使用上面的代码,它将在每个月的第1天运行计时器。