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