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);
+    }
+
 }