You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by jk...@apache.org on 2015/02/20 11:24:08 UTC
tapestry-5 git commit: TAP5-2455: if a job doesn't have a valid next
execution time, un-schedule it
Repository: tapestry-5
Updated Branches:
refs/heads/master 143e81039 -> 847403b0e
TAP5-2455: if a job doesn't have a valid next execution time, un-schedule it
Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/847403b0
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/847403b0
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/847403b0
Branch: refs/heads/master
Commit: 847403b0ea0f508ba90604dea13720942416bc32
Parents: 143e810
Author: Jochen Kemnade <jo...@eddyson.de>
Authored: Fri Feb 20 10:58:17 2015 +0100
Committer: Jochen Kemnade <jo...@eddyson.de>
Committed: Fri Feb 20 11:23:36 2015 +0100
----------------------------------------------------------------------
.../services/cron/PeriodicExecutorImpl.java | 21 +++++++++++++-
.../tapestry5/ioc/services/cron/Schedule.java | 2 +-
.../ioc/specs/PeriodicExecutorSpec.groovy | 30 ++++++++++++++++++++
3 files changed, 51 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/847403b0/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/cron/PeriodicExecutorImpl.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/cron/PeriodicExecutorImpl.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/cron/PeriodicExecutorImpl.java
index cf3c717..f50a077 100644
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/cron/PeriodicExecutorImpl.java
+++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/cron/PeriodicExecutorImpl.java
@@ -22,7 +22,10 @@ import org.apache.tapestry5.ioc.services.cron.PeriodicJob;
import org.apache.tapestry5.ioc.services.cron.Schedule;
import org.slf4j.Logger;
+import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
+import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
@@ -358,6 +361,8 @@ public class PeriodicExecutorImpl implements PeriodicExecutor, Runnable
try
{
jobLock.lock();
+ // TAP5-2455
+ Set<Job> jobsToCancel = null;
for (Job job : jobs)
{
@@ -368,7 +373,14 @@ public class PeriodicExecutorImpl implements PeriodicExecutor, Runnable
long jobNextExecution = job.getNextExecution();
- if (jobNextExecution <= now)
+ if (jobNextExecution <= 0)
+ {
+ if (jobsToCancel == null)
+ {
+ jobsToCancel = new HashSet<PeriodicExecutorImpl.Job>();
+ }
+ jobsToCancel.add(job);
+ } else if (jobNextExecution <= now)
{
job.start();
} else
@@ -376,6 +388,13 @@ public class PeriodicExecutorImpl implements PeriodicExecutor, Runnable
nextExecution = Math.min(nextExecution, jobNextExecution);
}
}
+ if (jobsToCancel != null)
+ {
+ for (Job job : jobsToCancel)
+ {
+ job.cancel();
+ }
+ }
} finally
{
jobLock.unlock();
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/847403b0/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/cron/Schedule.java
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/cron/Schedule.java b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/cron/Schedule.java
index 3203f8b..f22319e 100644
--- a/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/cron/Schedule.java
+++ b/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/cron/Schedule.java
@@ -31,7 +31,7 @@ public interface Schedule
* Computes the next execution time for a job.
*
* @param previousExecution time of previous execution (in system clock millis)
- * @return time of next execution (in system clock millis)
+ * @return time of next execution (in system clock millis) or a value <=0 to cancel the job's execution
*/
long nextExecution(long previousExecution);
}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/847403b0/tapestry-ioc/src/test/groovy/ioc/specs/PeriodicExecutorSpec.groovy
----------------------------------------------------------------------
diff --git a/tapestry-ioc/src/test/groovy/ioc/specs/PeriodicExecutorSpec.groovy b/tapestry-ioc/src/test/groovy/ioc/specs/PeriodicExecutorSpec.groovy
index f84521d..8ef5d13 100644
--- a/tapestry-ioc/src/test/groovy/ioc/specs/PeriodicExecutorSpec.groovy
+++ b/tapestry-ioc/src/test/groovy/ioc/specs/PeriodicExecutorSpec.groovy
@@ -1,10 +1,14 @@
package ioc.specs
+import org.apache.tapestry5.ioc.services.cron.CronSchedule;
import org.apache.tapestry5.ioc.services.cron.IntervalSchedule
import org.apache.tapestry5.ioc.services.cron.PeriodicExecutor
+import spock.lang.Issue;
+
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
+import java.util.concurrent.locks.ReentrantLock;
class PeriodicExecutorSpec extends AbstractRegistrySpecification {
@@ -24,6 +28,32 @@ class PeriodicExecutorSpec extends AbstractRegistrySpecification {
job && job.cancel()
+ }
+
+ @Issue('https://issues.apache.org/jira/browse/TAP5-2455')
+ def "One-shot job in the past is not executed"() {
+
+ setup:
+ buildRegistry()
+
+ def schedule = new CronSchedule('0 0 0 1 1 ? 2014')
+
+ def jobExecuted = Boolean.FALSE
+ when:
+
+ def job = getService(PeriodicExecutor).addJob(schedule, "Job in the past", { jobExecuted = Boolean.TRUE; lock.notifyAll() })
+
+ synchronized (jobExecuted) {
+ jobExecuted.wait(2000l)
+ }
+
+ then:
+ !jobExecuted
+ cleanup:
+
+ if (job && !job.isCanceled()){
+ job.cancel()
+ }
}
}