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 2014/10/17 11:48:18 UTC

svn commit: r1632527 - in /sling/trunk/bundles/extensions/event: pom.xml src/main/java/org/apache/sling/event/impl/jobs/JobTopicTraverser.java

Author: cziegeler
Date: Fri Oct 17 09:48:18 2014
New Revision: 1632527

URL: http://svn.apache.org/r1632527
Log:
SLING-4048 : Avoid keeping jobs in memory. 

Modified:
    sling/trunk/bundles/extensions/event/pom.xml
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobTopicTraverser.java

Modified: sling/trunk/bundles/extensions/event/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/pom.xml?rev=1632527&r1=1632526&r2=1632527&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/pom.xml (original)
+++ sling/trunk/bundles/extensions/event/pom.xml Fri Oct 17 09:48:18 2014
@@ -116,7 +116,7 @@
                         -Xmx2048m -XX:MaxPermSize=512m
                     </argLine>
                     <includes>
-                        <include>**/it/*</include>
+                        <include>**/it/ChaosTest*</include>
                     </includes>
                 </configuration>
             </plugin>

Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobTopicTraverser.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobTopicTraverser.java?rev=1632527&r1=1632526&r2=1632527&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobTopicTraverser.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobTopicTraverser.java Fri Oct 17 09:48:18 2014
@@ -29,6 +29,11 @@ import org.slf4j.Logger;
 /**
  * The job topic traverser is an utility class to traverse all jobs
  * of a specific topic in order of creation.
+ *
+ * The traverser can be used with two different callbacks,
+ * the resource callback is called with a resource object,
+ * the job callback with a job object created from the
+ * resource.
  */
 public class JobTopicTraverser {
 
@@ -38,7 +43,9 @@ public class JobTopicTraverser {
     public interface JobCallback {
 
         /**
-         * Callback handle for a job
+         * Callback handle for a job.
+         * If the callback signals to stop traversing, the current minute is still
+         * processed completely (to ensure correct ordering of jobs).
          * @param job The job to handle
          * @return <code>true</code> If processing should continue, <code>false</code> otherwise.
          */
@@ -51,7 +58,11 @@ public class JobTopicTraverser {
     public interface ResourceCallback {
 
         /**
-         * Callback handle for a resource
+         * Callback handle for a resource.
+         * The callback is called in sorted order on a minute base, all resources within a minute
+         * are not necessarily called in correct time order!
+         * If the callback signals to stop traversing, the traversal is stopped
+         * immediately.
          * @param rsrc The resource to handle
          * @return <code>true</code> If processing should continue, <code>false</code> otherwise.
          */
@@ -75,12 +86,29 @@ public class JobTopicTraverser {
         traverse(logger, topicResource, handler, null);
     }
 
+    /**
+     * Traverse the topic and call the callback for each found resource.
+     *
+     * Once the callback notifies to stop traversing by returning false, the
+     * traversal stops.
+     *
+     * @param logger        The logger to use for debug logging
+     * @param topicResource The topic resource
+     * @param handler       The callback
+     */
     public static void traverse(final Logger logger,
             final Resource topicResource,
             final ResourceCallback handler) {
         traverse(logger, topicResource, null, handler);
     }
 
+    /**
+     * Internal method for traversal
+     * @param logger        The logger to use for debug logging
+     * @param topicResource The topic resource
+     * @param jobHandler    The job callback
+     * @param resourceHandler    The resource callback
+     */
     private static void traverse(final Logger logger,
             final Resource topicResource,
             final JobCallback jobHandler,
@@ -113,20 +141,24 @@ public class JobTopicTraverser {
 
                             // now jobs
                             final List<JobImpl> jobs = new ArrayList<JobImpl>();
+                            // we use an iterator to skip removed entries
                             final Iterator<Resource> jobIter = minuteResource.listChildren();
                             while ( jobIter.hasNext() ) {
-                                final Resource jobResource = jobIter.next();
-
-                                if ( resourceHandler != null ) {
-                                    if ( !resourceHandler.handle(jobResource) ) {
-                                        return;
-                                    }
-                                } else {
-                                    final JobImpl job = Utility.readJob(logger, jobResource);
-                                    if ( job != null ) {
-                                        logger.debug("Found job {}", jobResource.getName());
-                                        jobs.add(job);
+                                try {
+                                    final Resource jobResource = jobIter.next();
+                                    if ( resourceHandler != null ) {
+                                        if ( !resourceHandler.handle(jobResource) ) {
+                                            return;
+                                        }
+                                    } else {
+                                        final JobImpl job = Utility.readJob(logger, jobResource);
+                                        if ( job != null ) {
+                                            logger.debug("Found job {}", jobResource.getName());
+                                            jobs.add(job);
+                                        }
                                     }
+                                } catch ( final IllegalStateException ise) {
+                                    // ignore
                                 }
                             }