Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   *  Licensed to the Apache Software Foundation (ASF) under one or more
   *  contributor license agreements.  See the NOTICE file distributed with
   *  this work for additional information regarding copyright ownership.
   *  The ASF licenses this file to You under the Apache License, Version 2.0
   *  (the "License"); you may not use this file except in compliance with
   *  the License.  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
  *
  *  Unless required by applicable law or agreed to in writing, software
  *  distributed under the License is distributed on an "AS IS" BASIS,
  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
 package org.apache.tomcat.websocket;
 
 import static org.jboss.web.WebsocketsMessages.MESSAGES;
 
 import  java.nio.channels.AsynchronousChannelGroup;
 
This is a utility class that enables multiple WsWebSocketContainer instances to share a single AsynchronousChannelGroup while ensuring that the group is destroyed when no longer required.
 
 public class AsyncChannelGroupUtil {
 
     private static AsynchronousChannelGroup group = null;
     private static int usageCount = 0;
     private static final Object lock = new Object();
 
 
     private AsyncChannelGroupUtil() {
         // Hide the default constructor
     }
 
 
     public static AsynchronousChannelGroup register() {
         synchronized () {
             if ( == 0) {
                  = createAsynchronousChannelGroup();
             }
             ++;
             return ;
         }
     }
 
 
     public static void unregister() {
         synchronized () {
             --;
             if ( == 0) {
                 .shutdown();
                  = null;
             }
         }
     }
 
 
     private static AsynchronousChannelGroup createAsynchronousChannelGroup() {
         // Need to do this with the right thread context class loader else the
         // first web app to call this will trigger a leak
         ClassLoader original = Thread.currentThread().getContextClassLoader();
 
         try {
             Thread.currentThread().setContextClassLoader(
                     AsyncIOThreadFactory.class.getClassLoader());
 
             // These are the same settings as the default
             // AsynchronousChannelGroup
             int initialSize = Runtime.getRuntime().availableProcessors();
             ExecutorService executorService = new ThreadPoolExecutor(
                     0,
                     .,
                     ..,
                     new SynchronousQueue<Runnable>(),
                     new AsyncIOThreadFactory());
 
             try {
                 return AsynchronousChannelGroup.withCachedThreadPool(
                         executorServiceinitialSize);
             } catch (IOException e) {
                 // No good reason for this to happen.
                 throw .asyncGroupFail();
             }
         } finally {
             Thread.currentThread().setContextClassLoader(original);
        }
    }
    private static class AsyncIOThreadFactory implements ThreadFactory {
        private AtomicInteger count = new AtomicInteger(0);
        @Override
        public Thread newThread(final Runnable r) {
            // Create the new Thread within a doPrivileged block to ensure that
            // the thread inherits the current ProtectionDomain which is
            // essential to be able to use this with a Java Applet. See
            // https://issues.apache.org/bugzilla/show_bug.cgi?id=57091
            return AccessController.doPrivileged(new PrivilegedAction<Thread>() {
                @Override
                public Thread run() {
                    Thread t = new Thread(r);
                    t.setName("WebSocketClient-AsyncIO-" + .incrementAndGet());
                    t.setContextClassLoader(this.getClass().getClassLoader());
                    t.setDaemon(true);
                    return t;
                }
            });
        }
    }
New to GrepCode? Check out our FAQ X