Author: norman
Date: Thu Nov 11 11:08:42 2010
New Revision: 1033885

URL: http://svn.apache.org/viewvc?rev=1033885&view=rev
Log:
register threadpools in jmx which are used for netty (JAMES-1057)

Added:
    james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/
    
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutor.java
    
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutorMBean.java
    
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/NamedThreadFactory.java
Modified:
    
james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
    
james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java
    james/server/trunk/netty-socket/pom.xml
    
james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractConfigurableAsyncServer.java
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
    
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
    
james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/netty/RemoteManager.java
    
james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/RemoteManagerTest.java
    
james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
    
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java
    
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java

Modified: 
james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
--- 
james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
 (original)
+++ 
james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
 Thu Nov 11 11:08:42 2010
@@ -163,5 +163,10 @@ public class IMAPServer extends Abstract
                return connectionLimit;
        }
 
+    @Override
+    protected String getDefaultJMXName() {
+        return "imapserver";
+    }
+
 
 }

Modified: 
james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
--- 
james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java
 (original)
+++ 
james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java
 Thu Nov 11 11:08:42 2010
@@ -255,4 +255,10 @@ public class LMTPServer extends Abstract
                return "unknown";
        }
 
+
+    @Override
+    protected String getDefaultJMXName() {
+        return "lmtpserver";
+    }
+
 }

Modified: james/server/trunk/netty-socket/pom.xml
URL: 
http://svn.apache.org/viewvc/james/server/trunk/netty-socket/pom.xml?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
--- james/server/trunk/netty-socket/pom.xml (original)
+++ james/server/trunk/netty-socket/pom.xml Thu Nov 11 11:08:42 2010
@@ -90,6 +90,16 @@
     </dependency>
     <dependency>
       <groupId>org.apache.james</groupId>
+      <artifactId>james-server-util</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>javax.mail</groupId>
+          <artifactId>mail</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.james</groupId>
       <artifactId>james-server-dnsservice-api</artifactId>
     </dependency>
     <dependency>

Modified: 
james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractConfigurableAsyncServer.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractConfigurableAsyncServer.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
--- 
james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractConfigurableAsyncServer.java
 (original)
+++ 
james/server/trunk/netty-socket/src/main/java/org/apache/james/socket/netty/AbstractConfigurableAsyncServer.java
 Thu Nov 11 11:08:42 2010
@@ -22,6 +22,7 @@ import java.io.FileInputStream;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.security.KeyStore;
+import java.util.concurrent.Executor;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
@@ -39,6 +40,7 @@ import org.apache.james.lifecycle.LogEna
 import org.apache.james.protocols.impl.AbstractAsyncServer;
 import org.apache.james.services.FileSystem;
 import org.apache.james.socket.ServerMBean;
+import org.apache.james.util.concurrent.JMXEnabledThreadPoolExecutor;
 
 
 /**
@@ -94,6 +96,8 @@ public abstract class AbstractConfigurab
     
     private SSLContext context;
 
+    private String jmxName;
+
     @Resource(name="dnsservice")
     public final void setDNSService(DNSService dns) {
         this.dns = dns;
@@ -152,6 +156,7 @@ public abstract class AbstractConfigurab
             throw new ConfigurationException( "Malformed bind parameter in 
configuration of service " + getServiceType(), unhe );
         }
 
+        jmxName = config.getString("jmxName",getDefaultJMXName());
         configureHelloName(handlerConfiguration);
 
         setTimeout(handlerConfiguration.getInt(TIMEOUT_NAME,DEFAULT_TIMEOUT));
@@ -437,5 +442,22 @@ public abstract class AbstractConfigurab
        public int getMaximumConcurrentConnections() {
                return connectionLimit;
        }
+       
+    @Override
+    protected Executor createBossExecutor() {
+        return 
JMXEnabledThreadPoolExecutor.newCachedThreadPool("org.apache.james:type=server,name="
 + jmxName + ",sub-type=threadpool", "boss");
+    }
+
+    @Override
+    protected Executor createWorkerExecutor() {
+        return 
JMXEnabledThreadPoolExecutor.newCachedThreadPool("org.apache.james:type=server,name="
 + jmxName + ",sub-type=threadpool", "worker");
+    }
     
+    /**
+     * Return the default name of the the server in JMX if none is configured 
via "jmxname" in the configuration
+     * 
+     * @return defaultJmxName
+     */
+    protected abstract String getDefaultJMXName();
+
 }

Modified: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3Server.java
 Thu Nov 11 11:08:42 2010
@@ -175,4 +175,9 @@ public class POP3Server extends Abstract
                return countHandler.getCurrentConnectionCount();
        }
 
+    @Override
+    protected String getDefaultJMXName() {
+        return "pop3server";
+    }
+
 }

Modified: 
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
 (original)
+++ 
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
 Thu Nov 11 11:08:42 2010
@@ -47,4 +47,11 @@ public class POP3ServerTest extends Abst
         m_pop3Server.setMailServer(m_mailServer);        
     }
 
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        m_pop3Server.destroy();
+
+    }
+
 }

Modified: 
james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/netty/RemoteManager.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/netty/RemoteManager.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
--- 
james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/netty/RemoteManager.java
 (original)
+++ 
james/server/trunk/remotemanager/src/main/java/org/apache/james/remotemanager/netty/RemoteManager.java
 Thu Nov 11 11:08:42 2010
@@ -164,5 +164,9 @@ public class RemoteManager extends Abstr
        }
 
 
+    @Override
+    protected String getDefaultJMXName() {
+        return "remotemanager";
+    }
 
 }

Modified: 
james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/RemoteManagerTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/RemoteManagerTest.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
--- 
james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/RemoteManagerTest.java
 (original)
+++ 
james/server/trunk/remotemanager/src/test/java/org/apache/james/remotemanager/RemoteManagerTest.java
 Thu Nov 11 11:08:42 2010
@@ -44,4 +44,10 @@ public class RemoteManagerTest extends A
                
     }
 
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        remotemanager.destroy();
+    }
+
 }

Modified: 
james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
--- 
james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
 (original)
+++ 
james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.java
 Thu Nov 11 11:08:42 2010
@@ -390,4 +390,14 @@ public class SMTPServer extends Abstract
        public String getNetworkInterface() {
                return "unknown";
        }
+
+
+    @Override
+    protected String getDefaultJMXName() {
+        return "smtpserver";
+    }
+
+
+   
+
 }

Modified: 
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
--- 
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java
 (original)
+++ 
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/AbstractSMTPServerTest.java
 Thu Nov 11 11:08:42 2010
@@ -190,6 +190,7 @@ public abstract class AbstractSMTPServer
         LifecycleUtil.dispose(m_mailServer);
         queue.clear();
         super.tearDown();
+        
     }
 
     public void verifyLastMail(String sender, String recipient, MimeMessage 
msg) throws IOException, MessagingException {

Modified: 
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java?rev=1033885&r1=1033884&r2=1033885&view=diff
==============================================================================
--- 
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
 (original)
+++ 
james/server/trunk/smtpserver/src/test/java/org/apache/james/smtpserver/SMTPServerTest.java
 Thu Nov 11 11:08:42 2010
@@ -49,6 +49,13 @@ public class SMTPServerTest extends Abst
         m_smtpServer.setMailServer(m_mailServer);        
     }
 
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        m_smtpServer.destroy();
+
+    }
+
     public void testMaxLineLength() throws Exception {
         finishSetUp(m_testConfiguration);
 

Added: 
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutor.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutor.java?rev=1033885&view=auto
==============================================================================
--- 
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutor.java
 (added)
+++ 
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutor.java
 Thu Nov 11 11:08:42 2010
@@ -0,0 +1,183 @@
+/****************************************************************
+ * 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.james.util.concurrent;
+
+import java.lang.management.ManagementFactory;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+
+/**
+ * {...@link ThreadPoolExecutor} which expose statistics via JMX
+ *
+ */
+public class JMXEnabledThreadPoolExecutor extends ThreadPoolExecutor 
implements JMXEnabledThreadPoolExecutorMBean {
+
+    private String jmxPath;
+    private final List<Runnable> inProgress = Collections.synchronizedList(new 
ArrayList<Runnable>());
+    private final ThreadLocal<Long> startTime = new ThreadLocal<Long>();
+    private long totalTime;
+    private int totalTasks;
+    private MBeanServer mbeanServer;
+    private String mbeanName;
+
+    public JMXEnabledThreadPoolExecutor(int corePoolSize, int maximumPoolSize, 
long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> queue, 
NamedThreadFactory tFactory, String jmxPath) {
+        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, queue, 
tFactory);
+        this.jmxPath = jmxPath;
+        registerMBean();
+    }
+
+    protected void beforeExecute(Thread t, Runnable r) {
+        super.beforeExecute(t, r);
+        inProgress.add(r);
+        startTime.set(System.currentTimeMillis());
+    }
+
+    protected void afterExecute(Runnable r, Throwable t) {
+        long time = System.currentTimeMillis() - startTime.get().longValue();
+        synchronized (this) {
+            totalTime += time;
+            ++totalTasks;
+        }
+        inProgress.remove(r);
+        super.afterExecute(r, t);
+    }
+
+    private void registerMBean() {
+        if (jmxPath != null) {
+            mbeanServer = ManagementFactory.getPlatformMBeanServer(); 
+            mbeanName = jmxPath + ",threadpool=" + 
((NamedThreadFactory)getThreadFactory()).getName();
+            try {
+                mbeanServer.registerMBean(this, new ObjectName(mbeanName));
+            } catch (Exception e) {
+                throw new RuntimeException("Unable to register mbean" , e);
+            }
+        }
+    }
+    
+    private void unregisterMBean(){
+        if (jmxPath != null) {
+            try {
+                mbeanServer.unregisterMBean(new ObjectName(mbeanName));
+           
+            } catch (Exception e) {
+                throw new RuntimeException("Unable to unregister mbean" , e);
+            }
+        }
+    }
+    
+    @Override
+    public synchronized void shutdown()
+    {
+        // synchronized, because there is no way to access super.mainLock, 
which would be
+        // the preferred way to make this threadsafe
+        if (!isShutdown())
+        {
+            unregisterMBean();
+        }
+        super.shutdown();
+    }
+
+    @Override
+    public synchronized List<Runnable> shutdownNow()
+    {
+        // synchronized, because there is no way to access super.mainLock, 
which would be
+        // the preferred way to make this threadsafe
+        if (!isShutdown())
+        {
+            unregisterMBean();
+        }
+        return super.shutdownNow();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.util.concurrent.JMXEnabledThreadPoolExecutorMBean#getTotalTasks()
+     */
+    public synchronized int getTotalTasks() {
+        return totalTasks;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.util.concurrent.JMXEnabledThreadPoolExecutorMBean#getAverageTaskTime()
+     */
+    public synchronized double getAverageTaskTime() {
+        return (totalTasks == 0) ? 0 : totalTime / totalTasks;
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.util.concurrent.JMXEnabledThreadPoolExecutorMBean#getActiveThreads()
+     */
+    public int getActiveThreads() {
+        return getPoolSize();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.util.concurrent.JMXEnabledThreadPoolExecutorMBean#getActiveTasks()
+     */
+    public int getActiveTasks() {
+        return getActiveCount();
+    }
+
+    /*
+     * (non-Javadoc)
+     * @see 
org.apache.james.util.concurrent.JMXEnabledThreadPoolExecutorMBean#getQueuedTasks()
+     */
+    public int getQueuedTasks() {
+        return getQueue().size();
+    }
+    
+    /**
+     * Create a cached instance of this class. If jmxPath is null it will not 
register itself to the {...@link MBeanServer}
+     * 
+     * @param jmxPath
+     * @param name
+     * @return pool
+     * 
+     */
+    public static JMXEnabledThreadPoolExecutor newCachedThreadPool(String 
jmxPath, String name) {
+        return new JMXEnabledThreadPoolExecutor(0, Integer.MAX_VALUE,
+                60L, TimeUnit.SECONDS,
+                new SynchronousQueue<Runnable>(), new 
NamedThreadFactory(name), jmxPath);
+
+    }
+    
+    /**
+     * Create a cached instance of this class. If jmxPath is null it will not 
register itself to the {...@link MBeanServer}
+     * 
+     * @param jmxPath
+     * @param factory
+     * @return pool
+     */
+    public static JMXEnabledThreadPoolExecutor newCachedThreadPool(String 
jmxPath, NamedThreadFactory factory) {
+        return new JMXEnabledThreadPoolExecutor(0, Integer.MAX_VALUE,
+                60L, TimeUnit.SECONDS,
+                new SynchronousQueue<Runnable>(), factory, jmxPath);
+    }
+}

Added: 
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutorMBean.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutorMBean.java?rev=1033885&view=auto
==============================================================================
--- 
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutorMBean.java
 (added)
+++ 
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/JMXEnabledThreadPoolExecutorMBean.java
 Thu Nov 11 11:08:42 2010
@@ -0,0 +1,57 @@
+/****************************************************************
+ * 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.james.util.concurrent;
+
+public interface JMXEnabledThreadPoolExecutorMBean {
+    
+    /**
+     * Return the active threads
+     * 
+     * @return aThreads
+     */
+    public int getActiveThreads();
+
+    /**
+     * Return the active Tasks
+     * 
+     * @return aTasks
+     */
+    public int getActiveTasks();
+
+    /**
+     * Return the total tasks handled by this executor
+     * 
+     * @return tTasks
+     */
+    public int getTotalTasks();
+
+    /**
+     * Return the queued tasks
+     * 
+     * @return qTasks
+     */
+    public int getQueuedTasks();
+
+    /**
+     * Return the average time for a task (in ms)
+     * 
+     * @return aTime
+     */
+    public double getAverageTaskTime();
+}

Added: 
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/NamedThreadFactory.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/NamedThreadFactory.java?rev=1033885&view=auto
==============================================================================
--- 
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/NamedThreadFactory.java
 (added)
+++ 
james/server/trunk/util/src/main/java/org/apache/james/util/concurrent/NamedThreadFactory.java
 Thu Nov 11 11:08:42 2010
@@ -0,0 +1,71 @@
+/****************************************************************
+ * 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.james.util.concurrent;
+
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * ThreadPool which use name  and a counter for thread names
+ *
+ */
+public class NamedThreadFactory implements ThreadFactory{
+
+    public final String name;
+    private final AtomicLong count = new AtomicLong();
+    private int priority;
+    
+    public NamedThreadFactory(final String name, final int priority) {
+        if (priority > Thread.MAX_PRIORITY || priority < Thread.MIN_PRIORITY) {
+            throw new IllegalArgumentException("Priority must be <= " + 
Thread.MAX_PRIORITY + " and >=" + Thread.MIN_PRIORITY);
+        }
+        this.name = name;
+        this.priority = priority;
+    }
+    
+    public NamedThreadFactory(final String name) {
+        this(name, Thread.NORM_PRIORITY);
+    }
+    
+    /*
+     * (non-Javadoc)
+     * @see java.util.concurrent.ThreadFactory#newThread(java.lang.Runnable)
+     */
+    public Thread newThread(Runnable r) {
+        Thread t = new Thread(r);
+        t.setName(name + "-" + count.incrementAndGet());
+        t.setPriority(priority);
+        return t;
+    }
+
+    /**
+     * Return the name
+     * 
+     * @return name
+     */
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String toString() {
+        return "NamedTreadFactory: " + getName();
+    }
+    
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to