我正在使用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));
有什么想法吗?
答案 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));