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 <[email protected]> Authored: Mon Jan 2 21:14:49 2017 -0700 Committer: Ralph Goers <[email protected]> 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); + } + }
