You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2009/05/04 15:47:51 UTC
svn commit: r771304 - in
/incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl:
OsgiControllerImpl.java OsgiControllerTask.java
OsgiControllerTaskExecutor.java ResourceQueueTask.java
Author: bdelacretaz
Date: Mon May 4 13:47:50 2009
New Revision: 771304
URL: http://svn.apache.org/viewvc?rev=771304&view=rev
Log:
SLING-904 - OsgiControllerTaskExecutor added, executes install/update/uninstall tasks in a separate thread
Added:
incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerTaskExecutor.java (with props)
incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/ResourceQueueTask.java (with props)
Modified:
incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerImpl.java
incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerTask.java
Modified: incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerImpl.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerImpl.java?rev=771304&r1=771303&r2=771304&view=diff
==============================================================================
--- incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerImpl.java (original)
+++ incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerImpl.java Mon May 4 13:47:50 2009
@@ -23,6 +23,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.Callable;
import org.apache.sling.jcr.jcrinstall.osgi.InstallableData;
import org.apache.sling.jcr.jcrinstall.osgi.JcrInstallException;
@@ -57,7 +58,8 @@
private OsgiResourceProcessorList processors;
private final Logger log = LoggerFactory.getLogger(this.getClass());
private ResourceOverrideRules roRules;
- private final List<OsgiControllerTask> tasks = new LinkedList<OsgiControllerTask>();
+ private final List<Callable<Object>> tasks = new LinkedList<Callable<Object>>();
+ private final OsgiControllerTaskExecutor executor = new OsgiControllerTaskExecutor();
public static final String STORAGE_FILENAME = "controller.storage";
@@ -140,21 +142,31 @@
/** {@inheritDoc} */
public void executeScheduledOperations() throws Exception {
+
+ // Ready to work?
if(processors == null) {
log.info("Not activated yet, cannot executeScheduledOperations");
return;
}
- // Execute all our tasks, and then let processors execute
- // their own queued operations
+ // Anything to do?
+ if(tasks.isEmpty()) {
+ return;
+ }
+
synchronized (tasks) {
- while(tasks.size() > 0) {
- tasks.remove(0).execute();
- }
+ // Add tasks for our processors to execute their own operations,
+ // after our own tasks are executed
+ for(OsgiResourceProcessor p : processors) {
+ tasks.add(new ResourceQueueTask(p));
+ }
+
+ // Now execute all our tasks in a separate thread
+ log.debug("Executing {} queued tasks", tasks.size());
+ final long start = System.currentTimeMillis();
+ executor.execute(tasks);
+ log.debug("Done executing queued tasks ({} msec)", System.currentTimeMillis() - start);
}
- for(OsgiResourceProcessor p : processors) {
- p.processResourceQueue();
- }
}
public void setResourceOverrideRules(ResourceOverrideRules r) {
Modified: incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerTask.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerTask.java?rev=771304&r1=771303&r2=771304&view=diff
==============================================================================
--- incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerTask.java (original)
+++ incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerTask.java Mon May 4 13:47:50 2009
@@ -21,8 +21,8 @@
import static org.apache.sling.jcr.jcrinstall.osgi.InstallResultCode.IGNORED;
import java.io.IOException;
-import java.util.Collection;
import java.util.Map;
+import java.util.concurrent.Callable;
import org.apache.sling.jcr.jcrinstall.osgi.InstallableData;
import org.apache.sling.jcr.jcrinstall.osgi.JcrInstallException;
@@ -34,7 +34,7 @@
/** An install/upgrade/uninistall task, meant to be executed
* by the OsgiController worker thread.
*/
-class OsgiControllerTask {
+class OsgiControllerTask implements Callable<Object> {
private final String uri;
private final InstallableData data;
@@ -61,12 +61,28 @@
this.data = data;
}
- void execute() throws JcrInstallException, IOException {
- if(data != null) {
+ @Override
+ public String toString() {
+ return
+ getClass().getSimpleName()
+ + ", "
+ + (isInstallOrUpdate() ? "install/update" : "uninstall")
+ + ", "
+ + uri
+ ;
+ }
+
+ public Object call() throws JcrInstallException, IOException {
+ if(isInstallOrUpdate()) {
executeInstallOrUpdate();
} else {
executeUninstall();
}
+ return null;
+ }
+
+ boolean isInstallOrUpdate() {
+ return data != null;
}
private void executeUninstall() throws JcrInstallException {
Added: incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerTaskExecutor.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerTaskExecutor.java?rev=771304&view=auto
==============================================================================
--- incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerTaskExecutor.java (added)
+++ incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerTaskExecutor.java Mon May 4 13:47:50 2009
@@ -0,0 +1,54 @@
+/*
+ * 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.jcr.jcrinstall.osgi.impl;
+
+import java.util.List;
+import java.util.concurrent.Callable;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/** Executes a list of OsgiController tasks in their own thread.
+ */
+class OsgiControllerTaskExecutor {
+ private final Logger log = LoggerFactory.getLogger(this.getClass());
+ static int counter;
+
+ /** Execute the given tasks in a new thread, return when done */
+ void execute(final List<Callable<Object>> tasks) throws InterruptedException {
+ final String threadName = getClass().getSimpleName() + " #" + (++counter);
+ final Thread t = new Thread(threadName) {
+ @Override
+ public void run() {
+ while(!tasks.isEmpty()) {
+ final Callable<Object> c = tasks.remove(0);
+ try {
+ c.call();
+ log.debug("Task execution successful: " + c);
+ } catch(Exception e) {
+ log.warn("Task execution failed: " + c, e);
+ }
+ }
+ }
+ };
+ t.setDaemon(true);
+ t.start();
+ t.join();
+ }
+}
Propchange: incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerTaskExecutor.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/OsgiControllerTaskExecutor.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Added: incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/ResourceQueueTask.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/ResourceQueueTask.java?rev=771304&view=auto
==============================================================================
--- incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/ResourceQueueTask.java (added)
+++ incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/ResourceQueueTask.java Mon May 4 13:47:50 2009
@@ -0,0 +1,42 @@
+/*
+ * 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.jcr.jcrinstall.osgi.impl;
+
+import java.util.concurrent.Callable;
+
+import org.apache.sling.jcr.jcrinstall.osgi.OsgiResourceProcessor;
+
+/** Callable that processes the resource queue of an OsgiResourceProcessor */
+class ResourceQueueTask implements Callable<Object> {
+ private final OsgiResourceProcessor p;
+
+ ResourceQueueTask(OsgiResourceProcessor p) {
+ this.p = p;
+ }
+
+ public String toString() {
+ return getClass().getSimpleName() + ": " + p.getClass().getSimpleName()+ ".processResourceQueue()";
+ }
+
+ public Object call() throws Exception {
+ p.processResourceQueue();
+ return null;
+ }
+
+}
Propchange: incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/ResourceQueueTask.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/trunk/contrib/extensions/jcrinstall/service/src/main/java/org/apache/sling/jcr/jcrinstall/osgi/impl/ResourceQueueTask.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL