Illustration einer tropischen Insel mit Palmen und einem hohen Berg

Java Blog für Programmierer

TaskExecutor und java.util.concurrent.Executor in Spring 2

· Christian Ullenboom

Seit Java 5 gibt es mit dem Executor (JSR 166) eine Schnittstelle für „Ausführer“ von Runnable-Objekten. Spring bietet mit dem TaskExecutor die gleiche Schnittstelle. – So steht die Funktionalität auch für Java 1.4 und Java 1.3 und auch für Java EE Umgebungen zur Verfügung. org.springframework.core.task.TaskExecutor: void execute( Runnable task )

Die TaskExecutor im Überblick

SimpleThreadPoolTaskExecutor – Thread-Pool durch Quartz’s SimpleThreadPool. SimpleAsyncTaskExecutor – Erzeugt pro Anfrage einen neuer Thread. Es gibt eine optionale maximale Größe. SyncTaskExecutor – Führt Runnable im aktuellen Thread aus. Erzeugt also keinen neuen Thread zur Nebenläufigkeit. ConcurrentTaskExecutor – Ein Wrapper zum java.util.concurrent.Executor von Java 5. ThreadPoolTaskExecutor – Geht direkt auf den java.util.concurrent.ThreadPoolExecutor von Java 5. Ermögicht Anpassung der Properties „corePoolSize“, „maxPoolSize“, „keepAliveSeconds“, „queueCapacity“. TimerTaskExecutor – Nutzt einen java.util.Timer zur Ausführung. Der Runnable wird als TimerTask hintereinander durch den Timer-Thread ausgeführt. WorkManagerTaskExecutor – Nutzt CommonJ WorkManager als Implementierung. Ermöglicht Ausführung auf Applikationsservern von BEA und IBM.

Beispiel für TaskExecutor

public class DoItExecutor
{
 private TaskExecutor executor;

public DoItExecutor( TaskExecutor executor )

 {
 this.executor = executor;
 }

 public void doIt()
 {
 Runnable run = new Runnable() {
 public void run() {
 System.out.println( Thread.currentThread() );
 }
 };

 executor.execute( run );
 executor.execute( run );
 }
}

Injizierung vom TaskExecutor

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
 <property name="corePoolSize" value="5″ />
 <property name="maxPoolSize" value="10″ />
 <property name="queueCapacity" value="25″ />
</bean>

<bean id="doItExecutor" class="DoItExecutor">
 <constructor-arg ref="taskExecutor" />
</bean>

„Fehlende“ Typen aus Java 5

Spring bietet unterschiedliche Implementierungen für den TaskExecutor, aber Java 5 bietet außer execute() im Executor noch mehr. Der java.util.concurrent.ThreadPoolExecutor implementiert mehr als nur Executor, nämlich ExecutorService. Das bietet – awaitTermination(), invokeAll(), invokeAny(), isShutdown(), isTerminated(), shutdown(), shutdownNow(), submit() – mit weiteren Typen wie Future, Callable. Spring bietet dafür bisher keine Abstraktion!

Kategorien: Allgemein

← Alle Beiträge