Author: rmannibucau Date: Thu Jan 31 14:56:03 2013 New Revision: 1440999 URL: http://svn.apache.org/viewvc?rev=1440999&view=rev Log: TOMEE-755 shutting down async pool
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/async/AsynchronousPool.java Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1440999&r1=1440998&r2=1440999&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Thu Jan 31 14:56:03 2013 @@ -1287,6 +1287,10 @@ public class Assembler extends Assembler logger.warning("Application id '" + appInfo.appId + "' not found in: " + Arrays.toString(containerSystem.getAppContextKeys())); return; } else { + final AsynchronousPool pool = appContext.get(AsynchronousPool.class); + if (pool != null) { + pool.stop(); + } final WebBeansContext webBeansContext = appContext.getWebBeansContext(); if (webBeansContext != null) { Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/async/AsynchronousPool.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/async/AsynchronousPool.java?rev=1440999&r1=1440998&r2=1440999&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/async/AsynchronousPool.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/async/AsynchronousPool.java Thu Jan 31 14:56:03 2013 @@ -18,13 +18,24 @@ package org.apache.openejb.async; import org.apache.openejb.AppContext; import org.apache.openejb.core.ThreadContext; +import org.apache.openejb.loader.Options; import org.apache.openejb.util.DaemonThreadFactory; +import org.apache.openejb.util.Duration; import org.apache.openejb.util.ExecutorBuilder; import javax.ejb.EJBException; import javax.ejb.NoSuchEJBException; import java.rmi.NoSuchObjectException; -import java.util.concurrent.*; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Callable; +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicBoolean; /** @@ -34,10 +45,12 @@ public class AsynchronousPool { private final BlockingQueue<Runnable> blockingQueue; private final ExecutorService executor; + private final Duration awaitDuration; - public AsynchronousPool(final ThreadPoolExecutor threadPoolExecutor) { + public AsynchronousPool(final ThreadPoolExecutor threadPoolExecutor, final Duration awaitDuration) { this.blockingQueue = threadPoolExecutor.getQueue(); this.executor = threadPoolExecutor; + this.awaitDuration = awaitDuration; } public static AsynchronousPool create(final AppContext appContext) { @@ -47,7 +60,11 @@ public class AsynchronousPool { .size(3) .threadFactory(new DaemonThreadFactory("@Asynchronous", appContext.getId())); - return new AsynchronousPool(builder.build(appContext.getOptions())); + final Options options = appContext.getOptions(); + final AsynchronousPool asynchronousPool = new AsynchronousPool( + builder.build(options), + options.get("AsynchronousPool.ShutdownWaitDuration", new Duration(1, TimeUnit.MINUTES))); + return asynchronousPool; } public Object invoke(final Callable<Object> callable, final boolean isVoid) throws Throwable { @@ -65,6 +82,15 @@ public class AsynchronousPool { } } + public void stop() { + executor.shutdown(); + try { // shouldn't really wait + executor.awaitTermination(awaitDuration.getTime(), awaitDuration.getUnit()); + } catch (InterruptedException e) { + // no-op + } + } + private class AsynchronousCall implements Callable<Object> { private final Callable<Object> callable;