488009: Introduced ThreadPoolTaskExecutor instead of SimpleAsyncTaskExecutor (TimerTaskExecutor was removed in Spring 4) as a production-ready default
Signed-off-by: Olaf Otto <olaf@x100.de>
diff --git a/docs/src/docbkx/reference/deployment.xml b/docs/src/docbkx/reference/deployment.xml
index 16ba872..371d89c 100644
--- a/docs/src/docbkx/reference/deployment.xml
+++ b/docs/src/docbkx/reference/deployment.xml
@@ -363,9 +363,7 @@
<footnote>Part of <literal>org.springframework.core.task</literal> package</footnote></entry>
<entry>Creates and runs the Spring application contexts associated with each bundle. The task executor is responsible for managing its own pool
of threads used by the application contexts</entry>
- <entry><classname>SimpleAsyncTaskExecutor</classname> is used by default which means a new thread will be created for each application contexts. While this
- is suitable for testing and development, we strongly recommend to use a <ulink url="http://en.wikipedia.org/wiki/Thread_pool_pattern">thread pool</ulink>
- in a production environment</entry>
+ <entry><classname>ThreadPoolTaskExecutor</classname> with a maximum number of threads equal to the number of available processors is used by default.</entry>
</row>
<row>
@@ -374,9 +372,9 @@
<footnote>Part of <literal>org.springframework.core.task</literal> package</footnote></entry>
<entry>Destroys managed Spring application contexts associated with each bundle. The task executor is responsible for managing its own pool
of threads used by the application contexts</entry>
- <entry><classname>SimpleAsyncTaskExecutor</classname> is used by default which means all application context will be destroyed in a serialized manner (which is
- desired). Since the shutdown order normally matters, it is recommended to keep the default implementation or, for managed environments, to use a thread-pool
- that executes only one task at a time (so that contexts are stopped in the given order).</entry>
+ <entry><classname>ThreadPoolTaskExecutor</classname> with a single thread is used by default which means all application context will be destroyed in a serialized manner (which is
+ desired). Since the shutdown order normally matters, it is recommended to keep the default implementation or, for managed environments, to use a thread-pool
+ that executes only one task at a time (so that contexts are stopped in the given order).</entry>
</row>
<row>
diff --git a/extender/src/main/java/org/eclipse/gemini/blueprint/extender/internal/support/ExtenderConfiguration.java b/extender/src/main/java/org/eclipse/gemini/blueprint/extender/internal/support/ExtenderConfiguration.java
index 043ada0..8370c62 100644
--- a/extender/src/main/java/org/eclipse/gemini/blueprint/extender/internal/support/ExtenderConfiguration.java
+++ b/extender/src/main/java/org/eclipse/gemini/blueprint/extender/internal/support/ExtenderConfiguration.java
@@ -33,8 +33,8 @@
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.event.SimpleApplicationEventMulticaster;
-import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
@@ -259,7 +259,7 @@
if (isTaskExecutorManagedInternally) {
log.warn("Forcing the (internally created) taskExecutor to stop...");
- ThreadGroup th = ((SimpleAsyncTaskExecutor) taskExecutor).getThreadGroup();
+ ThreadGroup th = ((ThreadPoolTaskExecutor) taskExecutor).getThreadGroup();
if (!th.isDestroyed()) {
// ask the threads nicely to stop
th.interrupt();
@@ -360,9 +360,11 @@
new ThreadGroup("eclipse-gemini-blueprint-extender[" + ObjectUtils.getIdentityHexString(this) + "]-threads");
threadGroup.setDaemon(false);
- SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor();
+ ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
+ taskExecutor.setMaxPoolSize(Runtime.getRuntime().availableProcessors());
taskExecutor.setThreadGroup(threadGroup);
taskExecutor.setThreadNamePrefix("EclipseGeminiBlueprintExtenderThread-");
+ taskExecutor.initialize();
isTaskExecutorManagedInternally = true;
@@ -370,10 +372,14 @@
}
private TaskExecutor createDefaultShutdownTaskExecutor() {
- SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor("Gemini Blueprint context shutdown thread ");
+ ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
+ taskExecutor.setThreadNamePrefix("Gemini Blueprint context shutdown thread ");
taskExecutor.setDaemon(true);
- taskExecutor.setConcurrencyLimit(1);
+ taskExecutor.setMaxPoolSize(1);
+ taskExecutor.initialize();
+
isShutdownTaskExecutorManagedInternally = true;
+
return taskExecutor;
}
diff --git a/extender/src/test/java/org/eclipse/gemini/blueprint/extender/internal/support/ExtenderConfigurationCustomSettingsTest.java b/extender/src/test/java/org/eclipse/gemini/blueprint/extender/internal/support/ExtenderConfigurationCustomSettingsTest.java
index ece5843..3456892 100644
--- a/extender/src/test/java/org/eclipse/gemini/blueprint/extender/internal/support/ExtenderConfigurationCustomSettingsTest.java
+++ b/extender/src/test/java/org/eclipse/gemini/blueprint/extender/internal/support/ExtenderConfigurationCustomSettingsTest.java
@@ -22,8 +22,8 @@
import org.eclipse.gemini.blueprint.mock.MockBundleContext;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
-import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.net.URL;
import java.util.Enumeration;
@@ -58,13 +58,13 @@
}
public void testTaskExecutor() throws Exception {
- assertTrue(config.getTaskExecutor() instanceof SimpleAsyncTaskExecutor);
- assertEquals("conf-extender-thread", ((SimpleAsyncTaskExecutor) config.getTaskExecutor()).getThreadNamePrefix());
+ assertTrue(config.getTaskExecutor() instanceof ThreadPoolTaskExecutor);
+ assertEquals("conf-extender-thread", ((ThreadPoolTaskExecutor) config.getTaskExecutor()).getThreadNamePrefix());
}
public void testShutdownTaskExecutor() throws Exception {
TaskExecutor executor = config.getShutdownTaskExecutor();
- assertTrue(executor instanceof SimpleAsyncTaskExecutor);
+ assertTrue(executor instanceof ThreadPoolTaskExecutor);
}
public void testEventMulticaster() throws Exception {
diff --git a/extender/src/test/java/org/eclipse/gemini/blueprint/extender/internal/support/ExtenderConfigurationDefaultSettingsTest.java b/extender/src/test/java/org/eclipse/gemini/blueprint/extender/internal/support/ExtenderConfigurationDefaultSettingsTest.java
index 1d60e38..520e36a 100644
--- a/extender/src/test/java/org/eclipse/gemini/blueprint/extender/internal/support/ExtenderConfigurationDefaultSettingsTest.java
+++ b/extender/src/test/java/org/eclipse/gemini/blueprint/extender/internal/support/ExtenderConfigurationDefaultSettingsTest.java
@@ -19,8 +19,8 @@
import org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.MandatoryImporterDependencyFactory;
import org.eclipse.gemini.blueprint.mock.MockBundleContext;
import org.osgi.framework.BundleContext;
-import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.List;
@@ -44,12 +44,12 @@
}
public void testTaskExecutor() throws Exception {
- assertTrue(config.getTaskExecutor() instanceof SimpleAsyncTaskExecutor);
+ assertTrue(config.getTaskExecutor() instanceof ThreadPoolTaskExecutor);
}
public void testShutdownTaskExecutor() throws Exception {
TaskExecutor executor = config.getShutdownTaskExecutor();
- assertTrue(executor instanceof SimpleAsyncTaskExecutor);
+ assertTrue(executor instanceof ThreadPoolTaskExecutor);
}
public void testEventMulticaster() throws Exception {
diff --git a/extender/src/test/resources/org/eclipse/gemini/blueprint/extender/internal/support/extender-custom-config.xml b/extender/src/test/resources/org/eclipse/gemini/blueprint/extender/internal/support/extender-custom-config.xml
index 1d4ad3c..f3d33ad 100644
--- a/extender/src/test/resources/org/eclipse/gemini/blueprint/extender/internal/support/extender-custom-config.xml
+++ b/extender/src/test/resources/org/eclipse/gemini/blueprint/extender/internal/support/extender-custom-config.xml
@@ -1,18 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:osgi="http://www.springframework.org/schema/osgi"
- xmlns:util="http://www.springframework.org/schema/util"
- xmlns:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
- <bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" p:threadGroupName="configured-extender"
- p:threadNamePrefix="conf-extender-thread" />
+ <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" p:threadGroupName="configured-extender"
+ p:threadNamePrefix="conf-extender-thread" />
- <bean id="shutdownTaskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>
+ <bean id="shutdownTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"/>
<bean id="applicationEventMulticaster" class="org.eclipse.gemini.blueprint.extender.internal.support.DummyApplicationEventMulticaster"/>
diff --git a/integration-tests/bundles/extender.fragment.bundle/src/main/resources/META-INF/spring/extender/extra-config.xml b/integration-tests/bundles/extender.fragment.bundle/src/main/resources/META-INF/spring/extender/extra-config.xml
index 2e30c21..0ef66ee 100644
--- a/integration-tests/bundles/extender.fragment.bundle/src/main/resources/META-INF/spring/extender/extra-config.xml
+++ b/integration-tests/bundles/extender.fragment.bundle/src/main/resources/META-INF/spring/extender/extra-config.xml
@@ -12,10 +12,10 @@
<osgi:reference id="packageAdmin"
interface="org.osgi.service.packageadmin.PackageAdmin" cardinality="0..1"/>
- <bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" p:threadGroupName="configured-extender"
- p:threadNamePrefix="conf-extender-thread" />
+ <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" p:threadGroupName="configured-extender"
+ p:threadNamePrefix="conf-extender-thread" />
- <bean id="shutdownTaskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>
+ <bean id="shutdownTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"/>
<util:properties id="extenderProperties">
<prop key="smth">bla</prop>
diff --git a/integration-tests/tests/src/test/java/org/eclipse/gemini/blueprint/iandt/extender/configuration/ExtenderConfigurationTest.java b/integration-tests/tests/src/test/java/org/eclipse/gemini/blueprint/iandt/extender/configuration/ExtenderConfigurationTest.java
index 96bb448..221d9b1 100644
--- a/integration-tests/tests/src/test/java/org/eclipse/gemini/blueprint/iandt/extender/configuration/ExtenderConfigurationTest.java
+++ b/integration-tests/tests/src/test/java/org/eclipse/gemini/blueprint/iandt/extender/configuration/ExtenderConfigurationTest.java
@@ -20,8 +20,8 @@
import org.osgi.framework.ServiceReference;
import org.osgi.service.packageadmin.PackageAdmin;
import org.springframework.context.ApplicationContext;
-import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.core.task.TaskExecutor;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.List;
import java.util.Properties;
@@ -67,7 +67,7 @@
public void testShutdownTaskExecutor() throws Exception {
assertTrue(context.containsBean("shutdownTaskExecutor"));
Object bean = context.getBean("shutdownTaskExecutor");
- assertTrue("unexpected type", bean instanceof SimpleAsyncTaskExecutor);
+ assertTrue("unexpected type", bean instanceof ThreadPoolTaskExecutor);
}
public void testTaskExecutor() throws Exception {