Closed
Description
Philippe Perrault opened SPR-14589 and commented
I believe I have found a bug in the CronSequenceGenerator. According to your documentation in the next(...) method the plan is to first round up to the next whole second instead the code just sets the milliseconds filed to 0. I believe the originalTimestamp should be 'long originalTimestamp = calendar.getTimeInMillis() + 1000;' in order to round up to the next second per "The Plan"
Here is the FQDN of the class
org.springframework.scheduling.support.CronSequenceGenerator
Here is the method in question:
public Date next(Date date) {
/*
The plan:
1 Round up to the next whole second
2 If seconds match move on, otherwise find the next match:
2.1 If next match is in the next minute then roll forwards
3 If minute matches move on, otherwise find the next match
3.1 If next match is in the next hour then roll forwards
3.2 Reset the seconds and go to 2
4 If hour matches move on, otherwise find the next match
4.1 If next match is in the next day then roll forwards,
4.2 Reset the minutes and seconds and go to 2
...
*/
Calendar calendar = new GregorianCalendar();
calendar.setTimeZone(this.timeZone);
calendar.setTime(date);
// First, just reset the milliseconds and try to calculate from there...
calendar.set(Calendar.MILLISECOND, 0);
long originalTimestamp = calendar.getTimeInMillis();
doNext(calendar, calendar.get(Calendar.YEAR));
if (calendar.getTimeInMillis() == originalTimestamp) {
// We arrived at the original timestamp - round up to the next whole second and try again...
calendar.add(Calendar.SECOND, 1);
doNext(calendar, calendar.get(Calendar.YEAR));
}
return calendar.getTime();
}
Affects: 3.2.17, 4.2.7, 4.3.1
Issue Links:
- CronSequenceGenerator.next() returns incorrect time [SPR-14480] #19049 CronSequenceGenerator.next() returns incorrect time
- CronSequenceGenerator fails to accurately compute earliest next date when using second expression [SPR-9459] #14094 CronSequenceGenerator fails to accurately compute earliest next date when using second expression
- CronSequenceGenerator constructor goes into infinite loop with invalid increments [SPR-12871] #17469 CronSequenceGenerator constructor goes into infinite loop with invalid increments
- CronSequenceGenerator causes StackOverflowError with reversed range values [SPR-14462] #19031 CronSequenceGenerator causes StackOverflowError with reversed range values