mirror of
https://github.com/apache/activemq.git
synced 2025-02-20 00:47:07 +00:00
resolve issue with roll over and cron parser, hudson builds in different TZ has repeated faiure on trunk, getNext may still need some work
git-svn-id: https://svn.apache.org/repos/asf/activemq/trunk@926646 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
eb7275d53a
commit
363a1cf599
@ -36,49 +36,46 @@ public class CronParser {
|
|||||||
if (cronEntry != null && cronEntry.length() > 0) {
|
if (cronEntry != null && cronEntry.length() > 0) {
|
||||||
List<String> list = tokenize(cronEntry);
|
List<String> list = tokenize(cronEntry);
|
||||||
List<CronEntry> entries = buildCronEntries(list);
|
List<CronEntry> entries = buildCronEntries(list);
|
||||||
Calendar calendar = Calendar.getInstance();
|
Calendar working = Calendar.getInstance();
|
||||||
calendar.setTimeInMillis(currentTime);
|
working.setTimeInMillis(currentTime);
|
||||||
int currentMinutes = calendar.get(Calendar.MINUTE);
|
|
||||||
int currentHours = calendar.get(Calendar.HOUR_OF_DAY);
|
|
||||||
int currentDayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
|
|
||||||
int currentMonth = calendar.get(Calendar.MONTH) + 1;
|
|
||||||
int currentDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
|
|
||||||
|
|
||||||
CronEntry minutes = entries.get(MINUTES);
|
CronEntry minutes = entries.get(MINUTES);
|
||||||
CronEntry hours = entries.get(HOURS);
|
CronEntry hours = entries.get(HOURS);
|
||||||
CronEntry dayOfMonth = entries.get(DAY_OF_MONTH);
|
CronEntry dayOfMonth = entries.get(DAY_OF_MONTH);
|
||||||
CronEntry month = entries.get(MONTH);
|
CronEntry month = entries.get(MONTH);
|
||||||
CronEntry dayOfWeek = entries.get(DAY_OF_MONTH);
|
CronEntry dayOfWeek = entries.get(DAY_OF_MONTH);
|
||||||
if (!isCurrent(month, currentMonth)) {
|
|
||||||
int nextMonth = getNext(month, currentMonth);
|
int currentMinutes = working.get(Calendar.MINUTE);
|
||||||
Calendar working = (Calendar) calendar.clone();
|
|
||||||
working.add(Calendar.MONTH, nextMonth);
|
|
||||||
result += working.getTimeInMillis();
|
|
||||||
}
|
|
||||||
if (!isCurrent(dayOfMonth, currentDayOfMonth)) {
|
|
||||||
int nextDay = getNext(dayOfMonth, currentMonth);
|
|
||||||
Calendar working = (Calendar) calendar.clone();
|
|
||||||
working.add(Calendar.DAY_OF_MONTH, nextDay);
|
|
||||||
result += working.getTimeInMillis();
|
|
||||||
}
|
|
||||||
if (!isCurrent(dayOfWeek, currentDayOfWeek)) {
|
|
||||||
int nextDay = getNext(dayOfWeek, currentDayOfWeek);
|
|
||||||
Calendar working = (Calendar) calendar.clone();
|
|
||||||
working.add(Calendar.DAY_OF_WEEK, nextDay);
|
|
||||||
result += working.getTimeInMillis();
|
|
||||||
}
|
|
||||||
if (!isCurrent(hours, currentHours)) {
|
|
||||||
int nextHour = getNext(hours, currentHours);
|
|
||||||
Calendar working = (Calendar) calendar.clone();
|
|
||||||
working.add(Calendar.HOUR_OF_DAY, nextHour);
|
|
||||||
result += working.getTimeInMillis();
|
|
||||||
}
|
|
||||||
if (!isCurrent(minutes, currentMinutes)) {
|
if (!isCurrent(minutes, currentMinutes)) {
|
||||||
int nextMinutes = getNext(minutes, currentMinutes);
|
int nextMinutes = getNext(minutes, currentMinutes);
|
||||||
Calendar working = (Calendar) calendar.clone();
|
|
||||||
working.add(Calendar.MINUTE, nextMinutes);
|
working.add(Calendar.MINUTE, nextMinutes);
|
||||||
result += working.getTimeInMillis();
|
result = working.getTimeInMillis();
|
||||||
}
|
}
|
||||||
|
int currentHours = working.get(Calendar.HOUR_OF_DAY);
|
||||||
|
if (!isCurrent(hours, currentHours)) {
|
||||||
|
int nextHour = getNext(hours, currentHours);
|
||||||
|
working.add(Calendar.HOUR_OF_DAY, nextHour);
|
||||||
|
result = working.getTimeInMillis();
|
||||||
|
}
|
||||||
|
int currentDayOfWeek = working.get(Calendar.DAY_OF_WEEK) - 1;
|
||||||
|
if (!isCurrent(dayOfWeek, currentDayOfWeek)) {
|
||||||
|
int nextDay = getNext(dayOfWeek, currentDayOfWeek);
|
||||||
|
working.add(Calendar.DAY_OF_WEEK, nextDay);
|
||||||
|
result = working.getTimeInMillis();
|
||||||
|
}
|
||||||
|
int currentMonth = working.get(Calendar.MONTH) + 1;
|
||||||
|
if (!isCurrent(month, currentMonth)) {
|
||||||
|
int nextMonth = getNext(month, currentMonth);
|
||||||
|
working.add(Calendar.MONTH, nextMonth);
|
||||||
|
result = working.getTimeInMillis();
|
||||||
|
}
|
||||||
|
int currentDayOfMonth = working.get(Calendar.DAY_OF_MONTH);
|
||||||
|
if (!isCurrent(dayOfMonth, currentDayOfMonth)) {
|
||||||
|
int nextDay = getNext(dayOfMonth, currentMonth);
|
||||||
|
working.add(Calendar.DAY_OF_MONTH, nextDay);
|
||||||
|
result = working.getTimeInMillis();
|
||||||
|
}
|
||||||
|
|
||||||
if (result == 0) {
|
if (result == 0) {
|
||||||
// this can occur for "* * * * *"
|
// this can occur for "* * * * *"
|
||||||
result = currentTime + 60 * 1000;
|
result = currentTime + 60 * 1000;
|
||||||
@ -148,7 +145,7 @@ public class CronParser {
|
|||||||
protected static List<Integer> calculateValues(CronEntry entry) {
|
protected static List<Integer> calculateValues(CronEntry entry) {
|
||||||
List<Integer> result = new ArrayList<Integer>();
|
List<Integer> result = new ArrayList<Integer>();
|
||||||
if (isAll(entry.token)) {
|
if (isAll(entry.token)) {
|
||||||
for (int i = entry.start; i < entry.end; i++) {
|
for (int i = entry.start; i <= entry.end; i++) {
|
||||||
result.add(i);
|
result.add(i);
|
||||||
}
|
}
|
||||||
} else if (isAStep(entry.token)) {
|
} else if (isAStep(entry.token)) {
|
||||||
@ -215,9 +212,9 @@ public class CronParser {
|
|||||||
|
|
||||||
static List<CronEntry> buildCronEntries(List<String> tokens) {
|
static List<CronEntry> buildCronEntries(List<String> tokens) {
|
||||||
List<CronEntry> result = new ArrayList<CronEntry>();
|
List<CronEntry> result = new ArrayList<CronEntry>();
|
||||||
CronEntry minutes = new CronEntry("Minutes", tokens.get(MINUTES), 0, 59);
|
CronEntry minutes = new CronEntry("Minutes", tokens.get(MINUTES), 0, 60);
|
||||||
result.add(minutes);
|
result.add(minutes);
|
||||||
CronEntry hours = new CronEntry("Hours", tokens.get(HOURS), 0, 23);
|
CronEntry hours = new CronEntry("Hours", tokens.get(HOURS), 0, 24);
|
||||||
result.add(hours);
|
result.add(hours);
|
||||||
CronEntry dayOfMonth = new CronEntry("DayOfMonth", tokens.get(DAY_OF_MONTH), 1, 31);
|
CronEntry dayOfMonth = new CronEntry("DayOfMonth", tokens.get(DAY_OF_MONTH), 1, 31);
|
||||||
result.add(dayOfMonth);
|
result.add(dayOfMonth);
|
||||||
|
@ -18,6 +18,8 @@ package org.apache.activemq.broker.scheduler;
|
|||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
|
import java.util.Calendar;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.jms.MessageFormatException;
|
import javax.jms.MessageFormatException;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@ -28,7 +30,13 @@ public class CronParserTest {
|
|||||||
public void testgetNextTimeMinutes() throws MessageFormatException {
|
public void testgetNextTimeMinutes() throws MessageFormatException {
|
||||||
String test = "30 * * * *";
|
String test = "30 * * * *";
|
||||||
long current = 20*60*1000;
|
long current = 20*60*1000;
|
||||||
|
Calendar calender = Calendar.getInstance();
|
||||||
|
calender.setTimeInMillis(current);
|
||||||
|
System.out.println("start:" + calender.getTime());
|
||||||
long next = CronParser.getNextScheduledTime(test, current);
|
long next = CronParser.getNextScheduledTime(test, current);
|
||||||
|
|
||||||
|
calender.setTimeInMillis(next);
|
||||||
|
System.out.println("next:" + calender.getTime());
|
||||||
long result = next - current;
|
long result = next - current;
|
||||||
assertEquals(60*10*1000,result);
|
assertEquals(60*10*1000,result);
|
||||||
}
|
}
|
||||||
@ -36,10 +44,30 @@ public class CronParserTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testgetNextTimeHours() throws MessageFormatException {
|
public void testgetNextTimeHours() throws MessageFormatException {
|
||||||
String test = "* 1 * * *";
|
String test = "* 1 * * *";
|
||||||
long current = 60*1000*60*5;
|
|
||||||
|
Calendar calender = Calendar.getInstance();
|
||||||
|
calender.set(1972, 2, 2, 17, 10, 0);
|
||||||
|
long current = calender.getTimeInMillis();
|
||||||
long next = CronParser.getNextScheduledTime(test, current);
|
long next = CronParser.getNextScheduledTime(test, current);
|
||||||
|
|
||||||
|
calender.setTimeInMillis(next);
|
||||||
long result = next - current;
|
long result = next - current;
|
||||||
long expected = 60*1000*60*18;
|
long expected = 60*1000*60*8;
|
||||||
|
assertEquals(expected,result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testgetNextTimeHoursZeroMin() throws MessageFormatException {
|
||||||
|
String test = "0 1 * * *";
|
||||||
|
|
||||||
|
Calendar calender = Calendar.getInstance();
|
||||||
|
calender.set(1972, 2, 2, 17, 10, 0);
|
||||||
|
long current = calender.getTimeInMillis();
|
||||||
|
long next = CronParser.getNextScheduledTime(test, current);
|
||||||
|
|
||||||
|
calender.setTimeInMillis(next);
|
||||||
|
long result = next - current;
|
||||||
|
long expected = 60*1000*60*7 + 60*1000*50;
|
||||||
assertEquals(expected,result);
|
assertEquals(expected,result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user