You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2014/03/21 20:50:11 UTC

svn commit: r1580031 - in /tomcat/trunk/java/org/apache/tomcat/util/net: Nio2Endpoint.java res/LocalStrings.properties

Author: remm
Date: Fri Mar 21 19:50:11 2014
New Revision: 1580031

URL: http://svn.apache.org/r1580031
Log:
- Actually follow the instructions on proper NIO2 shutdown. Much cleaner indeed.
- The downside is that the executor is exclusive to the thread group (no way around this), so it cannot be shared with other connectors.
- Add a warning if using a shared executor.

Modified:
    tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java
    tomcat/trunk/java/org/apache/tomcat/util/net/res/LocalStrings.properties

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java?rev=1580031&r1=1580030&r2=1580031&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java Fri Mar 21 19:50:11 2014
@@ -93,6 +93,11 @@ public class Nio2Endpoint extends Abstra
     private static ThreadLocal<Boolean> inlineCompletion = new ThreadLocal<>();
 
     /**
+     * Thread group associated with the server socket.
+     */
+    private AsynchronousChannelGroup threadGroup = null;
+
+    /**
      * The oom parachute, when an OOM error happens,
      * will release the data, giving the JVM instantly
      * a chunk of data to be able to recover with.
@@ -288,10 +293,13 @@ public class Nio2Endpoint extends Abstra
         if ( getExecutor() == null ) {
             createExecutor();
         }
-        AsynchronousChannelGroup threadGroup = null;
         if (getExecutor() instanceof ExecutorService) {
             threadGroup = AsynchronousChannelGroup.withThreadPool((ExecutorService) getExecutor());
         }
+        // AsynchronousChannelGroup currently needs exclusive access to its executor service
+        if (!internalExecutor) {
+            log.warn(sm.getString("endpoint.nio2.exclusiveExecutor"));
+        }
 
         serverSock = AsynchronousServerSocketChannel.open(threadGroup);
         socketProperties.setProperties(serverSock);
@@ -420,6 +428,32 @@ public class Nio2Endpoint extends Abstra
     }
 
 
+    @Override
+    public void shutdownExecutor() {
+        if (threadGroup != null && internalExecutor) {
+            try {
+                threadGroup.shutdownNow();
+            } catch (IOException e) {
+                getLog().warn(sm.getString("endpoint.warn.executorShutdown", getName()), e);
+            }
+            long timeout = getExecutorTerminationTimeoutMillis();
+            if (timeout > 0) {
+                try {
+                    threadGroup.awaitTermination(timeout, TimeUnit.MILLISECONDS);
+                } catch (InterruptedException e) {
+                    // Ignore
+                }
+                if (!threadGroup.isTerminated()) {
+                    getLog().warn(sm.getString("endpoint.warn.executorShutdown", getName()));
+                }
+            }
+            threadGroup = null;
+        }
+        // Mostly to cleanup references
+        super.shutdownExecutor();
+    }
+
+
     // ------------------------------------------------------ Protected Methods
 
 

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/res/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/res/LocalStrings.properties?rev=1580031&r1=1580030&r2=1580031&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/res/LocalStrings.properties (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/res/LocalStrings.properties Fri Mar 21 19:50:11 2014
@@ -59,3 +59,4 @@ endpoint.apr.pollError=Poller failed wit
 endpoint.apr.pollUnknownEvent=A socket was returned from the poller with an unrecognized event [{0}]
 endpoint.apr.remoteport=APR socket [{0}] opened with remote port [{1}]
 endpoint.nio.selectorCloseFail=Failed to close selector when closing the poller
+endpoint.nio2.exclusiveExecutor=The NIO2 connector requires an exclusive executor to operate properly



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org