Skip to content

CronSequenceGenerator.next() is not implemented as documented [SPR-14589] #19158

Closed
@spring-projects-issues

Description

@spring-projects-issues

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:

Metadata

Metadata

Assignees

Labels

status: declinedA suggestion or change that we don't feel we should currently apply

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions