【问题标题】:Yearly timer doesn't work年度计时器不起作用
【发布时间】:2013-09-01 23:55:29
【问题描述】:

我正在使用 EJB 3.1。 在下面的代码中,我试图创建一个每年重复的计时器:

        ScheduleExpression scheduleExpression = new ScheduleExpression();
        Date now = new Date();
        scheduleExpression.start(now);     
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        scheduleExpression.minute(calendar.get(Calendar.MINUTE));
        scheduleExpression.hour(calendar.get(Calendar.HOUR_OF_DAY));
        scheduleExpression.dayOfMonth(calendar.get(Calendar.DAY_OF_MONTH));
        scheduleExpression.month(calendar.get(Calendar.MONTH));

但它不起作用,实际上行为是非常随机的(在某些重复中有效,而在另一些中则无效)。

奇怪的是我也有每月重复一次(见下面的代码)而且它正在工作。

    ScheduleExpression scheduleExpression = new ScheduleExpression();
    Date now = new Date();
    scheduleExpression.start(now);     
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(now);
    scheduleExpression.minute(calendar.get(Calendar.MINUTE));
    scheduleExpression.hour(calendar.get(Calendar.HOUR_OF_DAY));
    scheduleExpression.dayOfMonth(calendar.get(Calendar.DAY_OF_MONTH));

有什么想法吗?

【问题讨论】:

  • 你如何测试这个:等待一年?我永远不会这样做(这么长的时间),因为您必须非常小心,在部署、AS 升级、硬件升级之后存储/恢复计划。
  • @Beryllium:改变墙上时间是一种方法。
  • @Beryllium:为了测试这个,让应用程序在虚拟机中运行,只需更改我可以测试它的日期。

标签: java jakarta-ee timer ejb scheduled-tasks


【解决方案1】:

对于 Java 中的公历实现,月份是从零开始的,例如 Calendar 的 javadocs 中所述:

公历和儒略历中的第一个月是 一月是0;最后一个取决于 a 中的月数 年。

ScheduleExpression 中的月份是从一开始的:

month : 一年中的一个或多个月份

允许值:

  • [1,12]
  • {“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、十二月” }

因此,下面的代码构造 ScheduleExpression 是一个月是过去一个月(或者在 1 月值 0 的情况下是无效参数,但似乎没有严格指定无效情况下的行为)。

Date now = new Date();
...
scheduleExpression.dayOfMonth(calendar.get(Calendar.DAY_OF_MONTH));

【讨论】:

  • 谢谢,我会检查奇怪的行为是不是因为这个差异。
  • 这是问题之一,另一个是我过去(几秒钟)创建了计时器,然后它没有被触发。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多