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;


Reply via email to