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 2015/12/29 15:26:48 UTC

svn commit: r1722140 - in /sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config: JobManagerConfiguration.java QueueConfigurationManager.java TopologyHandler.java

Author: cziegeler
Date: Tue Dec 29 14:26:48 2015
New Revision: 1722140

URL: http://svn.apache.org/viewvc?rev=1722140&view=rev
Log:
SLING-5406 : Optimize configuration change handling

Modified:
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config/JobManagerConfiguration.java
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config/QueueConfigurationManager.java
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config/TopologyHandler.java

Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config/JobManagerConfiguration.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config/JobManagerConfiguration.java?rev=1722140&r1=1722139&r2=1722140&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config/JobManagerConfiguration.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config/JobManagerConfiguration.java Tue Dec 29 14:26:48 2015
@@ -43,7 +43,6 @@ import org.apache.sling.commons.osgi.Pro
 import org.apache.sling.commons.scheduler.Scheduler;
 import org.apache.sling.discovery.TopologyEvent;
 import org.apache.sling.discovery.TopologyEvent.Type;
-import org.apache.sling.discovery.TopologyEventListener;
 import org.apache.sling.event.impl.EnvironmentComponent;
 import org.apache.sling.event.impl.jobs.Utility;
 import org.apache.sling.event.impl.jobs.tasks.CheckTopologyTask;
@@ -81,7 +80,7 @@ import org.slf4j.LoggerFactory;
     @Property(name=JobManagerConfiguration.PROPERTY_BACKGROUND_LOAD_DELAY,
               longValue=JobManagerConfiguration.DEFAULT_BACKGROUND_LOAD_DELAY, propertyPrivate=true),
 })
-public class JobManagerConfiguration implements TopologyEventListener {
+public class JobManagerConfiguration {
 
     /** Logger. */
     private final Logger logger = LoggerFactory.getLogger("org.apache.sling.event.impl.jobs");
@@ -219,7 +218,6 @@ public class JobManagerConfiguration imp
             resolver.close();
         }
         this.active.set(true);
-        this.queueConfigManager.addListener(this);
     }
 
     /**
@@ -239,7 +237,6 @@ public class JobManagerConfiguration imp
     protected void deactivate() {
         this.active.set(false);
         this.stopProcessing();
-        this.queueConfigManager.removeListener();
     }
 
     public boolean isActive() {
@@ -433,17 +430,6 @@ public class JobManagerConfiguration imp
     }
 
     /**
-     * This method is invoked by the queue configuration manager
-     * whenever the queue configuration changes.
-     */
-    public void queueConfigurationChanged() {
-        final TopologyCapabilities caps = this.topologyCapabilities;
-        if ( caps != null && this.isActive() ) {
-            this.startProcessing(Type.PROPERTIES_CHANGED, caps, true, true);
-        }
-    }
-
-    /**
      * Stop processing
      * @param deactivate Whether to deactivate the capabilities
      */
@@ -528,12 +514,22 @@ public class JobManagerConfiguration imp
     }
 
     /**
+     * This method is invoked asynchronously from the TopologyHandler.
+     * Therefore this method can't be invoked concurrently
      * @see org.apache.sling.discovery.TopologyEventListener#handleTopologyEvent(org.apache.sling.discovery.TopologyEvent)
      */
-    @Override
     public void handleTopologyEvent(final TopologyEvent event) {
         this.logger.debug("Received topology event {}", event);
 
+        // queue configuration changed?
+        if ( event == null ) {
+            final TopologyCapabilities caps = this.topologyCapabilities;
+            if ( caps != null && this.isActive() ) {
+                this.startProcessing(Type.PROPERTIES_CHANGED, caps, true, true);
+            }
+            return;
+        }
+
         boolean runMaintenanceTasks = true;
         // check if there is a change of properties which doesn't affect us
         // but we need to use the new view !

Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config/QueueConfigurationManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config/QueueConfigurationManager.java?rev=1722140&r1=1722139&r2=1722140&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config/QueueConfigurationManager.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config/QueueConfigurationManager.java Tue Dec 29 14:26:48 2015
@@ -54,7 +54,7 @@ public class QueueConfigurationManager {
     private MainQueueConfiguration mainQueueConfiguration;
 
     /** Listener - this is the job manager configuration component. */
-    private volatile JobManagerConfiguration changeListener;
+    private volatile TopologyHandler changeListener;
 
     /**
      * Add a new queue configuration.
@@ -175,7 +175,7 @@ public class QueueConfigurationManager {
      * Add a config listener.
      * @param listener
      */
-    public void addListener(final JobManagerConfiguration listener) {
+    public void addListener(final TopologyHandler listener) {
         this.changeListener = listener;
     }
 
@@ -190,7 +190,7 @@ public class QueueConfigurationManager {
      * Update the listener.
      */
     private void updateListener() {
-        final JobManagerConfiguration l = this.changeListener;
+        final TopologyHandler l = this.changeListener;
         if ( l != null ) {
             l.queueConfigurationChanged();
         }

Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config/TopologyHandler.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config/TopologyHandler.java?rev=1722140&r1=1722139&r2=1722140&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config/TopologyHandler.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/config/TopologyHandler.java Tue Dec 29 14:26:48 2015
@@ -32,6 +32,10 @@ import org.apache.sling.discovery.Topolo
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * This topology handler is handling the topology change events asynchronously
+ * and processes them by queuing them.
+ */
 @Component
 @Service(value = TopologyEventListener.class)
 public class TopologyHandler implements TopologyEventListener, Runnable {
@@ -51,6 +55,7 @@ public class TopologyHandler implements
     @Activate
     protected void activate() {
         this.isActive.set(true);
+        this.configuration.getQueueConfigurationManager().addListener(this);
         final Thread thread = new Thread(this, "Apache Sling Job Topology Listener Thread");
         thread.setDaemon(true);
 
@@ -59,6 +64,7 @@ public class TopologyHandler implements
 
     @Deactivate
     protected void deactivate() {
+        this.configuration.getQueueConfigurationManager().removeListener();
         this.isActive.set(false);
         this.queue.clear();
         try {
@@ -81,6 +87,20 @@ public class TopologyHandler implements
         }
     }
 
+    /**
+     * This method is invoked by the queue configuration manager
+     * whenever the queue configuration changes.
+     */
+    public void queueConfigurationChanged() {
+        final QueueItem item = new QueueItem();
+        try {
+            this.queue.put(item);
+        } catch ( final InterruptedException ie) {
+            logger.warn("Thread got interrupted.", ie);
+            Thread.currentThread().interrupt();
+        }
+    }
+
     @Override
     public void run() {
         while ( isActive.get() ) {
@@ -92,7 +112,7 @@ public class TopologyHandler implements
                 Thread.currentThread().interrupt();
                 isActive.set(false);
             }
-            if ( isActive.get() && item != null && item.event != null ) {
+            if ( isActive.get() && item != null ) {
                 final JobManagerConfiguration config = this.configuration;
                 if ( config != null ) {
                     config.handleTopologyEvent(item.event);