You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rg...@apache.org on 2017/01/03 04:14:55 UTC
logging-log4j2 git commit: LOG4J2-1653 - More correct version of
getPrevFireTime
Repository: logging-log4j2
Updated Branches:
refs/heads/master d3c09fadd -> d9318ba34
LOG4J2-1653 - More correct version of getPrevFireTime
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/d9318ba3
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/d9318ba3
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/d9318ba3
Branch: refs/heads/master
Commit: d9318ba344a47fd44ed8f77de8ed46e0608405e2
Parents: d3c09fa
Author: Ralph Goers <rg...@nextiva.com>
Authored: Mon Jan 2 21:14:49 2017 -0700
Committer: Ralph Goers <rg...@nextiva.com>
Committed: Mon Jan 2 21:14:49 2017 -0700
----------------------------------------------------------------------
.../core/config/ConfigurationScheduler.java | 12 ++-
.../logging/log4j/core/util/CronExpression.java | 52 +++++++++++--
.../log4j/core/util/CronExpressionTest.java | 80 ++++++++++++++++++++
3 files changed, 134 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d9318ba3/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationScheduler.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationScheduler.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationScheduler.java
index 60a28f6..98aff02 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationScheduler.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/ConfigurationScheduler.java
@@ -49,13 +49,17 @@ public class ConfigurationScheduler extends AbstractLifeCycle {
setStopping();
if (isExecutorServiceSet()) {
LOGGER.debug("{} shutting down threads in {}", SIMPLE_NAME, getExecutorService());
- List<Runnable> tasks = executorService.shutdownNow();
- if (tasks != null && tasks.size() > 0) {
+ executorService.shutdown();
+ try {
+ executorService.awaitTermination(timeout, timeUnit);
+ } catch (InterruptedException ie) {
+ executorService.shutdownNow();
try {
executorService.awaitTermination(timeout, timeUnit);
- } catch (InterruptedException ie) {
- LOGGER.warn("ConfigurationScheduler stopped before all tasks were completed.");
+ } catch (InterruptedException inner) {
+ LOGGER.warn("ConfigurationScheduler stopped but some scheduled services may not have completed.");
}
+
}
}
setStopped();
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d9318ba3/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CronExpression.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CronExpression.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CronExpression.java
index 8adfad8..626bfba 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CronExpression.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/util/CronExpression.java
@@ -1568,12 +1568,14 @@ public final class CronExpression {
Calendar cl = Calendar.getInstance(getTimeZone());
// to match this
- Date now = new Date();
- Date nextFireTime = getTimeAfter(now);
- Date secondTime = getTimeAfter(nextFireTime);
- long interval = secondTime.getTime() - nextFireTime.getTime();
- Date prevCheckDate = new Date(now.getTime() - interval);
- Date prevFireTime = getTimeAfter(prevCheckDate);
+ Date start = targetDate;
+ long minIncrement = findMinIncrement();
+ Date prevFireTime;
+ do {
+ Date prevCheckDate = new Date(start.getTime() - minIncrement);
+ prevFireTime = getTimeAfter(prevCheckDate);
+ start = prevCheckDate;
+ } while (prevFireTime.after(targetDate));
return prevFireTime;
}
@@ -1581,6 +1583,44 @@ public final class CronExpression {
return getTimeBefore(targetDate);
}
+ private long findMinIncrement() {
+ if (seconds.size() != 1) {
+ return minInSet(seconds) * 1000;
+ } else if (seconds.first() == ALL_SPEC_INT) {
+ return 1000;
+ }
+ if (minutes.size() != 1) {
+ return minInSet(minutes) * 60000;
+ } else if (minutes.first() == ALL_SPEC_INT) {
+ return 60000;
+ }
+ if (hours.size() != 1) {
+ return minInSet(hours) * 3600000;
+ } else if (hours.first() == ALL_SPEC_INT) {
+ return 3600000;
+ }
+ return 86400000;
+ }
+
+ private int minInSet(TreeSet<Integer> set) {
+ int previous = 0;
+ int min = Integer.MAX_VALUE;
+ boolean first = true;
+ for (int value : set) {
+ if (first) {
+ previous = value;
+ first = false;
+ continue;
+ } else {
+ int diff = value - previous;
+ if (diff < min) {
+ min = diff;
+ }
+ }
+ }
+ return min;
+ }
+
private int findIncrement(String[] expression) {
// * * * * * * *
// [0]SEC [1]MIN [2]HOUR [3]DAYOFMONTH [4]MONTH [5]DAYOFWEEK [6]YEAR
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d9318ba3/log4j-core/src/test/java/org/apache/logging/log4j/core/util/CronExpressionTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/CronExpressionTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/util/CronExpressionTest.java
index db586b7..d096e39 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/util/CronExpressionTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/util/CronExpressionTest.java
@@ -64,4 +64,84 @@ public class CronExpressionTest {
final Date expected = new GregorianCalendar(2015, 10, 30, 7, 0, 0).getTime();
assertEquals("Dates not equal.", expected, fireDate);
}
+
+ @Test
+ public void testPrevFireTime1() throws Exception {
+ CronExpression parser = new CronExpression("0 */15,12 7-11,13-17 L * ?");
+ Date date = new GregorianCalendar(2015, 10, 2).getTime();
+ Date fireDate = parser.getPrevFireTime(date);
+ Date expected = new GregorianCalendar(2015, 9, 31, 17, 45, 0).getTime();
+ assertEquals("Dates not equal.", expected, fireDate);
+ }
+
+ @Test
+ public void testPrevFireTime2() throws Exception {
+ CronExpression parser = new CronExpression("0 0/5 14,18 * * ?");
+ Date date = new GregorianCalendar(2015, 10, 2).getTime();
+ Date fireDate = parser.getPrevFireTime(date);
+ Date expected = new GregorianCalendar(2015, 10, 1, 18, 55, 0).getTime();
+ assertEquals("Dates not equal.", expected, fireDate);
+ }
+
+ /**
+ * 35,45, and 55 minutes past the hour evern hour.
+ */
+ @Test
+ public void testPrevFireTime3() throws Exception {
+ CronExpression parser = new CronExpression("0 35/10 * * * ?");
+ Date date = new GregorianCalendar(2015, 10, 2).getTime();
+ Date fireDate = parser.getPrevFireTime(date);
+ Date expected = new GregorianCalendar(2015, 10, 1, 23, 55, 0).getTime();
+ assertEquals("Dates not equal.", expected, fireDate);
+ }
+
+ /**
+ *
+ * 10:15 every day.
+ */
+ @Test
+ public void testPrevFireTimeTenFifteen() throws Exception {
+ CronExpression parser = new CronExpression("0 15 10 * * ? *");
+ Date date = new GregorianCalendar(2015, 10, 2).getTime();
+ Date fireDate = parser.getPrevFireTime(date);
+ Date expected = new GregorianCalendar(2015, 10, 1, 10, 15, 0).getTime();
+ assertEquals("Dates not equal.", expected, fireDate);
+ }
+
+ /**
+ * Every day from 2 pm to 2:59 pm
+ */
+ @Test
+ public void testPrevFireTimeTwoPM() throws Exception {
+ CronExpression parser = new CronExpression("0 * 14 * * ?");
+ Date date = new GregorianCalendar(2015, 10, 2).getTime();
+ Date fireDate = parser.getPrevFireTime(date);
+ Date expected = new GregorianCalendar(2015, 10, 1, 14, 59, 0).getTime();
+ assertEquals("Dates not equal.", expected, fireDate);
+ }
+
+ /**
+ * 2:10pm and at 2:44pm every Wednesday in the month of March.
+ */
+ @Test
+ public void testPrevFireTimeMarch() throws Exception {
+ CronExpression parser = new CronExpression("0 10,44 14 ? 3 WED");
+ Date date = new GregorianCalendar(2015, 10, 2).getTime();
+ Date fireDate = parser.getPrevFireTime(date);
+ Date expected = new GregorianCalendar(2015, 2, 25, 14, 44, 0).getTime();
+ assertEquals("Dates not equal.", expected, fireDate);
+ }
+
+ /**
+ * Fire at 10:15am on the third Friday of every month.
+ */
+ @Test
+ public void testPrevFireTimeThirdFriday() throws Exception {
+ CronExpression parser = new CronExpression("0 15 10 ? * 6#3");
+ Date date = new GregorianCalendar(2015, 10, 2).getTime();
+ Date fireDate = parser.getPrevFireTime(date);
+ Date expected = new GregorianCalendar(2015, 9, 16, 10, 15, 0).getTime();
+ assertEquals("Dates not equal.", expected, fireDate);
+ }
+
}