每年计时器不起作用

时间:2013-08-29 13:48:42

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

我正在使用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));

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

  

格里高利和朱利安日历中的第一个月是   1月份是0;最后一个取决于一个月的月数   年。

ScheduleExpression中的月份是基于一个的:

  

月:一年内一个月或多个月

     

允许值:

     
      
  • [1,12]
  •   
  • {“Jan”,“Feb”,“Mar”,“Apr”,“May”,“Jun”,“Jul”,“Aug”,“Sep”,“Oct”,“Nov”,Dec“ }
  •   

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

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