You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2009/09/23 11:35:05 UTC

svn commit: r818017 - in /sling/trunk/bundles/commons/scheduler: ./ src/main/java/org/apache/sling/commons/scheduler/ src/main/java/org/apache/sling/commons/scheduler/impl/

Author: cziegeler
Date: Wed Sep 23 09:35:04 2009
New Revision: 818017

URL: http://svn.apache.org/viewvc?rev=818017&view=rev
Log:
SLING-447 - Add support to fire a job n times; as the api is enhanced, the version is updated to 2.1.0

Added:
    sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/JobHandler.java   (with props)
Modified:
    sling/trunk/bundles/commons/scheduler/pom.xml
    sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/Scheduler.java
    sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/QuartzJobExecutor.java
    sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/QuartzScheduler.java

Modified: sling/trunk/bundles/commons/scheduler/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/scheduler/pom.xml?rev=818017&r1=818016&r2=818017&view=diff
==============================================================================
--- sling/trunk/bundles/commons/scheduler/pom.xml (original)
+++ sling/trunk/bundles/commons/scheduler/pom.xml Wed Sep 23 09:35:04 2009
@@ -29,7 +29,7 @@
 
     <artifactId>org.apache.sling.commons.scheduler</artifactId>
     <packaging>bundle</packaging>
-    <version>2.0.5-SNAPSHOT</version>
+    <version>2.1.0-SNAPSHOT</version>
 
     <name>Apache Sling Scheduler Support</name>
     <description>

Modified: sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/Scheduler.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/Scheduler.java?rev=818017&r1=818016&r2=818017&view=diff
==============================================================================
--- sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/Scheduler.java (original)
+++ sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/Scheduler.java Wed Sep 23 09:35:04 2009
@@ -88,6 +88,19 @@
     throws Exception;
 
     /**
+     * Fire a job immediately more than once.
+     *
+     * @param job The job to execute (either {@link Job} or {@link Runnable}).
+     * @param config An optional configuration object - this configuration is only passed to the job the job implements {@link Job}.
+     * @param times The number of times this job should be started (must be higher than 1)
+     * @param period Every period seconds this job is started.
+     * @throws IllegalArgumentException If the job has not the correct type.
+     * @return true if the code could be added, false otherwise.
+     * @since 2.1
+     */
+    boolean fireJob(Object job, Map<String, Serializable> config, int times, long period);
+
+    /**
      * Fire a job once at a specific date
      * Note that if a job with the same name has already beed added, the old job is cancelled and this new job replaces
      * the old job.
@@ -103,6 +116,23 @@
     throws Exception;
 
     /**
+     * Fire a job once at a specific date, several times with a given interval.
+     * Note that if a job with the same name has already beed added, the old job is cancelled and this new job replaces
+     * the old job.
+     *
+     * @param name The name of the job - or null. If no name is specified it can't be cancelled.
+     * @param job The job to execute (either {@link Job} or {@link Runnable}).
+     * @param config An optional configuration object - this configuration is only passed to the job the job implements {@link Job}.
+     * @param date The date this job should be run.
+     * @param times The number of times this job should be started (must be higher than 1)
+     * @param period Every period seconds this job is started.
+     * @throws IllegalArgumentException If the job has not the correct type.
+     * @return true if the code could be added, false otherwise.
+     * @since 2.1
+     */
+    boolean fireJobAt(String name, Object job, Map<String, Serializable> config, Date date, int times, long period);
+
+    /**
      * Remove a scheduled job by name.
      *
      * @param name The name of the job.

Added: sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/JobHandler.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/JobHandler.java?rev=818017&view=auto
==============================================================================
--- sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/JobHandler.java (added)
+++ sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/JobHandler.java Wed Sep 23 09:35:04 2009
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.commons.scheduler.impl;
+
+/**
+ * The job handler controls the invocation of a job
+ * like parallel invocation and the number of times
+ * the job can be called.
+ */
+public class JobHandler {
+
+    public final boolean runConcurrently;
+
+    public volatile boolean isRunning;
+
+    public JobHandler(final boolean runConcurrently) {
+        this.runConcurrently = runConcurrently;
+        this.isRunning = false;
+    }
+}
\ No newline at end of file

Propchange: sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/JobHandler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/JobHandler.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Propchange: sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/JobHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/QuartzJobExecutor.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/QuartzJobExecutor.java?rev=818017&r1=818016&r2=818017&view=diff
==============================================================================
--- sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/QuartzJobExecutor.java (original)
+++ sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/QuartzJobExecutor.java Wed Sep 23 09:35:04 2009
@@ -40,15 +40,14 @@
 
         final JobDataMap data = context.getJobDetail().getJobDataMap();
 
-        final QuartzScheduler.ConcurrentHandler concurrentHandler
-             = (QuartzScheduler.ConcurrentHandler)data.get(QuartzScheduler.DATA_MAP_CONCURRENT_HANDLER);
-        final boolean canRunConcurrently = (concurrentHandler == null ? true : concurrentHandler.runConcurrently);
+        final JobHandler handler = (JobHandler)data.get(QuartzScheduler.DATA_MAP_JOB_HANDLER);
+        final boolean canRunConcurrently = (handler == null ? true : handler.runConcurrently);
 
         if (!canRunConcurrently) {
-            if ( concurrentHandler.isRunning ) {
+            if ( handler.isRunning ) {
                 return;
             }
-            concurrentHandler.isRunning = true;
+            handler.isRunning = true;
         }
 
         final Object job = data.get(QuartzScheduler.DATA_MAP_OBJECT);
@@ -77,7 +76,7 @@
             logger.error("Exception during job execution of " + job + " : " + t.getMessage(), t);
         } finally {
             if (!canRunConcurrently) {
-                concurrentHandler.isRunning = false;
+                handler.isRunning = false;
             }
         }
     }

Modified: sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/QuartzScheduler.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/QuartzScheduler.java?rev=818017&r1=818016&r2=818017&view=diff
==============================================================================
--- sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/QuartzScheduler.java (original)
+++ sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/QuartzScheduler.java Wed Sep 23 09:35:04 2009
@@ -79,8 +79,8 @@
     /** Map key for the logger. */
     static final String DATA_MAP_LOGGER = "QuartzJobScheduler.Logger";
 
-    /** Map key for the concurrent handler */
-    static final String DATA_MAP_CONCURRENT_HANDLER = "QuartzJobExecutor.ConcurrentHandler";
+    /** Map key for the job handler */
+    static final String DATA_MAP_JOB_HANDLER = "QuartzJobExecutor.JobHandler";
 
     /** Theq quartz scheduler. */
     protected volatile org.quartz.Scheduler scheduler;
@@ -203,7 +203,7 @@
      *
      * @throws SchedulerException thrown in case of errors
      */
-    protected void scheduleJob(String name,
+    protected void scheduleJob(final String name,
                                final Object job,
                                final Map<String, Serializable>    config,
                                final Trigger trigger,
@@ -228,16 +228,16 @@
                 }
             } catch (final SchedulerException ignored) {
             }
-        } else {
-            name = PREFIX + UUID.randomUUID().toString();
         }
 
+        final String jobName = this.getJobName(name);
+
         // create the data map
-        final JobDataMap jobDataMap = this.initDataMap(name, job, config, canRunConcurrently);
+        final JobDataMap jobDataMap = this.initDataMap(jobName, job, config, canRunConcurrently);
 
-        final JobDetail detail = this.createJobDetail(name, jobDataMap);
+        final JobDetail detail = this.createJobDetail(jobName, jobDataMap);
 
-        this.logger.debug("Scheduling job {} with name {} and trigger {}", new Object[] {job, name, trigger});
+        this.logger.debug("Scheduling job {} with name {} and trigger {}", new Object[] {job, jobName, trigger});
         s.scheduleJob(detail, trigger);
     }
 
@@ -249,18 +249,17 @@
      * @param concurent
      * @return
      */
-    protected JobDataMap initDataMap(String  jobName,
-                                     Object  job,
-                                     Map<String, Serializable> config,
-                                     boolean concurent) {
+    protected JobDataMap initDataMap(final String  jobName,
+                                     final Object  job,
+                                     final Map<String, Serializable> config,
+                                     final boolean concurrent) {
         final JobDataMap jobDataMap = new JobDataMap();
 
         jobDataMap.put(DATA_MAP_OBJECT, job);
 
         jobDataMap.put(DATA_MAP_NAME, jobName);
-        final ConcurrentHandler handler = new ConcurrentHandler();
-        handler.runConcurrently = concurent;
-        jobDataMap.put(DATA_MAP_CONCURRENT_HANDLER, handler);
+        final JobHandler handler = new JobHandler(concurrent);
+        jobDataMap.put(DATA_MAP_JOB_HANDLER, handler);
         jobDataMap.put(DATA_MAP_LOGGER, this.logger);
         if ( config != null ) {
             jobDataMap.put(DATA_MAP_CONFIGURATION, config);
@@ -275,7 +274,7 @@
      * @param jobDataMap
      * @return
      */
-    protected JobDetail createJobDetail(String name, JobDataMap jobDataMap) {
+    protected JobDetail createJobDetail(final String name, final JobDataMap jobDataMap) {
         final JobDetail detail = new JobDetail(name, DEFAULT_QUARTZ_JOB_GROUP, QuartzJobExecutor.class);
         detail.setJobDataMap(jobDataMap);
         return detail;
@@ -294,11 +293,11 @@
     /**
      * @see org.apache.sling.commons.scheduler.Scheduler#addJob(java.lang.String, java.lang.Object, java.util.Map, java.lang.String, boolean)
      */
-    public void addJob(String name,
-                       Object job,
-                       Map<String, Serializable>    config,
-                       String schedulingExpression,
-                       boolean canRunConcurrently)
+    public void addJob(final String name,
+                       final Object job,
+                       final Map<String, Serializable>    config,
+                       final String schedulingExpression,
+                       final boolean canRunConcurrently)
     throws SchedulerException {
         final CronTrigger cronJobEntry = new CronTrigger(name, DEFAULT_QUARTZ_JOB_GROUP);
 
@@ -313,44 +312,105 @@
     /**
      * @see org.apache.sling.commons.scheduler.Scheduler#addPeriodicJob(java.lang.String, java.lang.Object, java.util.Map, long, boolean)
      */
-    public void addPeriodicJob(String name, Object job, Map<String, Serializable> config, long period, boolean canRunConcurrently)
+    public void addPeriodicJob(final String name,
+                               final Object job,
+                               final Map<String, Serializable> config,
+                               final long period,
+                               final boolean canRunConcurrently)
     throws SchedulerException {
         final long ms = period * 1000;
-        if ( name == null ) {
-            name = PREFIX + UUID.randomUUID().toString();
-        }
+        final String jobName = this.getJobName(name);
+
         final SimpleTrigger timeEntry =
-            new SimpleTrigger(name, DEFAULT_QUARTZ_JOB_GROUP, new Date(System.currentTimeMillis() + ms), null,
+            new SimpleTrigger(jobName, DEFAULT_QUARTZ_JOB_GROUP, new Date(System.currentTimeMillis() + ms), null,
                               SimpleTrigger.REPEAT_INDEFINITELY, ms);
 
-        this.scheduleJob(name, job, config, timeEntry, canRunConcurrently);
+        this.scheduleJob(jobName, job, config, timeEntry, canRunConcurrently);
     }
 
     /**
      * @see org.apache.sling.commons.scheduler.Scheduler#fireJob(java.lang.Object, java.util.Map)
      */
-    public void fireJob(Object job, Map<String, Serializable> config)
+    public void fireJob(final Object job, final Map<String, Serializable> config)
     throws SchedulerException {
         this.checkJob(job);
-        final String name = job.getClass().getName();
-        final JobDataMap dataMap = this.initDataMap(name, job, config, true);
+        final String jobName = job.getClass().getName();
+        final JobDataMap dataMap = this.initDataMap(jobName, job, config, true);
 
-        final JobDetail detail = this.createJobDetail(name, dataMap);
+        final JobDetail detail = this.createJobDetail(jobName, dataMap);
 
-        final Trigger trigger = new SimpleTrigger(name, DEFAULT_QUARTZ_JOB_GROUP);
+        final Trigger trigger = new SimpleTrigger(jobName, DEFAULT_QUARTZ_JOB_GROUP);
         this.scheduler.scheduleJob(detail, trigger);
     }
 
     /**
      * @see org.apache.sling.commons.scheduler.Scheduler#fireJobAt(java.lang.String, java.lang.Object, java.util.Map, java.util.Date)
      */
-    public void fireJobAt(String name, Object job, Map<String, Serializable> config, Date date)
+    public void fireJobAt(final String name, final Object job, final Map<String, Serializable> config, final Date date)
     throws SchedulerException {
-        if ( name == null ) {
-            name = PREFIX + UUID.randomUUID().toString();
+        final String jobName = this.getJobName(name);
+        final SimpleTrigger trigger = new SimpleTrigger(jobName, DEFAULT_QUARTZ_JOB_GROUP, date);
+        this.scheduleJob(jobName, job, config, trigger, true);
+    }
+
+    /**
+     * @see org.apache.sling.commons.scheduler.Scheduler#fireJob(java.lang.Object, java.util.Map, int, long)
+     */
+    public boolean fireJob(final Object job,
+                           final Map<String, Serializable> config,
+                           final int times,
+                           final long period) {
+        this.checkJob(job);
+        if ( times < 2 ) {
+            throw new IllegalArgumentException("Times argument must be higher than 1");
+        }
+        final long ms = period * 1000;
+        final String jobName = job.getClass().getName();
+        final JobDataMap dataMap = this.initDataMap(jobName, job, config, true);
+
+        final JobDetail detail = this.createJobDetail(jobName, dataMap);
+
+        final Trigger trigger = new SimpleTrigger(jobName, DEFAULT_QUARTZ_JOB_GROUP, times, ms);
+        try {
+            this.scheduler.scheduleJob(detail, trigger);
+        } catch (final SchedulerException se) {
+            // ignore this and return false
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * @see org.apache.sling.commons.scheduler.Scheduler#fireJobAt(java.lang.String, java.lang.Object, java.util.Map, java.util.Date, int, long)
+     */
+    public boolean fireJobAt(final String name,
+                             final Object job,
+                             final Map<String, Serializable> config,
+                             final Date date,
+                             final int times,
+                             final long period) {
+        if ( times < 2 ) {
+            throw new IllegalArgumentException("Times argument must be higher than 1");
+        }
+        final String jobName = job.getClass().getName();
+        final long ms = period * 1000;
+        final SimpleTrigger trigger = new SimpleTrigger(jobName, DEFAULT_QUARTZ_JOB_GROUP, date, null, times, ms);
+        try {
+            this.scheduleJob(jobName, job, config, trigger, true);
+        } catch (final SchedulerException se) {
+            // ignore this and return false
+            return false;
         }
-        final SimpleTrigger trigger = new SimpleTrigger(name, DEFAULT_QUARTZ_JOB_GROUP, date);
-        this.scheduleJob(name, job, config, trigger, true);
+        return true;
+    }
+
+    /**
+     * Helper method which gets always a job name.
+     * @param name The job name or null
+     * @return The input job name or a unique job name.
+     */
+    private String getJobName(final String name) {
+        return name != null ? name : PREFIX + UUID.randomUUID();
     }
 
     /**
@@ -578,11 +638,4 @@
             this.executor = null;
         }
     }
-
-    protected static final class ConcurrentHandler {
-
-        public boolean runConcurrently;
-
-        public boolean isRunning = false;
-    }
 }