【问题标题】:Java EE 7: Get @Schedule date when is set to persistent = trueJava EE 7:获取 @Schedule 日期设置为持久性 = true
【发布时间】:2014-09-19 08:00:51
【问题描述】:

在我的 Java EE 7 应用程序中,我创建了一个每小时运行一次的持久调度任务。我使用了@Schedule 注释。

调用此作业时,我想对从过去一小时到现在发生的事件执行一些操作。要获得 NOW,我使用“new Date()”。

这个@Schedule 的默认持久属性为“true”,这很好,因为如果服务器在几个小时内停止,我想在它重新启动时执行这些任务。

问题是,如果服务器在 5 小时内停止,作业将启动 5 次,但在所有执行中都会执行“new Date()”,结果是一样的。

有什么方法可以检索应该启动@Schedule 作业的日期???

【问题讨论】:

    标签: jakarta-ee schedule


    【解决方案1】:

    有什么方法可以检索应该启动@Schedule 作业的日期???

    我认为答案是否定的,没有。

    specification 定义了三个必须由容器实现的接口。 这些接口是:TimerServiceTimerTimerHandle。 如您所见,其中没有一个(特别是 Timer)公开该方法 你需要的。因此,不强制符合 Java EE 的服务器实现此行为。

    您可能应该自己实现一个满足此要求的解决方案。 例如,您可以存储最后一个回调方法时的时间戳 已执行并使用此时间戳来确定时间段(而不是从当前日期减去 1 小时)

    ...如果服务器在 5 小时内停止,作业将启动 5 次...

    请注意,您不能依赖此

    18.4.3 定时器过期和超时回调方法 ...在干预期间过期的任何间隔持久计时器或基于调度的持久计时器 time 必须导致在重启时至少调用一次相应的超时回调方法。

    【讨论】:

      【解决方案2】:

      您可以使用 javax.ejb.Timer 重建计时器实际运行的时间:

      @Timeout
      public void timeout(Timer timer) {
          // get next time
          Date nextTime = timer.getNextTimeout();
          // substract 1 hour
          Calendar c = Calendar.getInstance();
          c.setTime(timer.getNextTimeout());
          c.add(Calendar.HOUR_OF_DAY, -1);
          Date actualTimerDate = c.getTime();
      }
      

      【讨论】:

      • 我想直接使用 TimerService 可以以某种方式实现,但我想从 @Schedule 注释的方法中使用。
      • 此方法在使用持久定时器时不起作用,因为当服务器关闭并重新启动时,在 JBoss 中它将以相同的下一个超时值运行所有错过的定时器。
      猜你喜欢
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多