You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2011/04/13 17:37:16 UTC

svn commit: r1091822 - in /james/server/trunk: imapserver/src/main/java/org/apache/james/imapserver/netty/ lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/ pop3server/ pop3server/src/main/java/org/apache/james/pop3server/core/ pop3server/src...

Author: norman
Date: Wed Apr 13 15:37:15 2011
New Revision: 1091822

URL: http://svn.apache.org/viewvc?rev=1091822&view=rev
Log:
To boost up performance its important to insert an ExecutionHandler in the chain to load of heavy IO-Bound tasks and unblock the IO-Threads. This also ensures that everything works with NIO and OIO

Added:
    james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractExecutorAwareChannelPipelineFactory.java
Modified:
    james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/IMAPServer.java
    james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/NettyConstants.java
    james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/OioIMAPServer.java
    james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/LMTPServer.java
    james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/OioLMTPServer.java
    james/server/trunk/pop3server/pom.xml
    james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/POP3CommandDispatcherLineHandler.java
    james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/OioPOP3Server.java
    james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.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/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java
    james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/OioSMTPServer.java
    james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/SMTPServer.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=1091822&r1=1091821&r2=1091822&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 Wed Apr 13 15:37:15 2011
@@ -35,11 +35,14 @@ import org.apache.james.protocols.impl.C
 import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer;
 import org.jboss.netty.channel.ChannelPipeline;
 import org.jboss.netty.channel.ChannelPipelineFactory;
+import org.jboss.netty.channel.ChannelUpstreamHandler;
 import org.jboss.netty.channel.group.ChannelGroup;
 import org.jboss.netty.handler.codec.frame.DelimiterBasedFrameDecoder;
 import org.jboss.netty.handler.codec.frame.Delimiters;
+import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
 import org.jboss.netty.handler.connection.ConnectionLimitUpstreamHandler;
 import org.jboss.netty.handler.connection.ConnectionPerIpLimitUpstreamHandler;
+import org.jboss.netty.handler.execution.ExecutionHandler;
 import org.jboss.netty.handler.ssl.SslHandler;
 import org.jboss.netty.handler.stream.ChunkedWriteHandler;
 import org.jboss.netty.util.HashedWheelTimer;
@@ -62,6 +65,8 @@ public class IMAPServer extends Abstract
     private int maxLineLength;
 
     private int inMemorySizeLimit;
+    
+    
 
     // Use a big default
     public final static int DEFAULT_MAX_LINE_LENGTH = 65536;
@@ -116,7 +121,7 @@ public class IMAPServer extends Abstract
         return new ChannelPipelineFactory() {
             private final ChannelGroupHandler groupHandler = new ChannelGroupHandler(group);
             private final HashedWheelTimer timer = new HashedWheelTimer();
-
+            
             // Timeout of 30 minutes See rfc2060 5.4 for details
             private final static int TIMEOUT = 60 * 30;
             private final TimeUnit TIMEOUT_UNIT = TimeUnit.SECONDS;
@@ -146,12 +151,12 @@ public class IMAPServer extends Abstract
 
                 pipeline.addLast(CHUNK_WRITE_HANDLER, new ChunkedWriteHandler());
 
-                if (isStartTLSSupported()) {
-                    pipeline.addLast(CORE_HANDLER, new ImapChannelUpstreamHandler(hello, processor, encoder, getLogger(), compress, getSSLContext(), getEnabledCipherSuites()));
-                } else {
-                    pipeline.addLast(CORE_HANDLER, new ImapChannelUpstreamHandler(hello, processor, encoder, getLogger(), compress));
+                ExecutionHandler ehandler = getExecutionHandler();
+                if (ehandler  != null) {
+                    pipeline.addLast(EXECUTION_HANDLER, ehandler);
                 }
-
+               
+                pipeline.addLast(CORE_HANDLER, createCoreHandler());
                 return pipeline;
             }
 
@@ -163,4 +168,22 @@ public class IMAPServer extends Abstract
         return "imapserver";
     }
 
+    @Override
+    protected ChannelUpstreamHandler createCoreHandler() {
+        ImapChannelUpstreamHandler coreHandler;
+        if (isStartTLSSupported()) {
+           coreHandler = new ImapChannelUpstreamHandler(hello, processor, encoder, getLogger(), compress, getSSLContext(), getEnabledCipherSuites());
+        } else {
+           coreHandler = new ImapChannelUpstreamHandler(hello, processor, encoder, getLogger(), compress);
+        }
+        return coreHandler;
+    }
+
+    /**
+     * Return null as we don't need this
+     */
+    protected OneToOneEncoder createEncoder() {
+        return null;
+    }
+
 }

Modified: james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/NettyConstants.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/NettyConstants.java?rev=1091822&r1=1091821&r2=1091822&view=diff
==============================================================================
--- james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/NettyConstants.java (original)
+++ james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/NettyConstants.java Wed Apr 13 15:37:15 2011
@@ -34,5 +34,6 @@ public interface NettyConstants {
     final static String CONNECTION_LIMIT_PER_IP_HANDLER = "connectionPerIpLimitHandler";
     final static String CONNECTION_COUNT_HANDLER = "connectionCountHandler";
     final static String CHUNK_WRITE_HANDLER = "chunkWriteHandler";
+    final static String EXECUTION_HANDLER = "executionHandler";
 
 }

Modified: james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/OioIMAPServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/OioIMAPServer.java?rev=1091822&r1=1091821&r2=1091822&view=diff
==============================================================================
--- james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/OioIMAPServer.java (original)
+++ james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/OioIMAPServer.java Wed Apr 13 15:37:15 2011
@@ -20,6 +20,7 @@ package org.apache.james.imapserver.nett
 
 import org.jboss.netty.channel.socket.ServerSocketChannelFactory;
 import org.jboss.netty.channel.socket.oio.OioServerSocketChannelFactory;
+import org.jboss.netty.handler.execution.ExecutionHandler;
 
 /**
  * IMAPServer which use old IO and not NIO. If you want to use NIO you should
@@ -40,4 +41,14 @@ public class OioIMAPServer extends IMAPS
         return -1;
     }
 
+    /**
+     * As OIO use one thread per connection we disable the use of the {@link ExecutionHandler}
+     * 
+     */
+    @Override
+    protected ExecutionHandler createExecutionHander() {
+        return null;
+    }
+
+
 }

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=1091822&r1=1091821&r2=1091822&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 Wed Apr 13 15:37:15 2011
@@ -24,15 +24,11 @@ import javax.net.ssl.SSLContext;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.james.protocols.api.ProtocolHandlerChain;
-import org.apache.james.protocols.impl.AbstractSSLAwareChannelPipelineFactory;
 import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer;
 import org.apache.james.protocols.smtp.SMTPConfiguration;
 import org.apache.james.smtpserver.netty.SMTPChannelUpstreamHandler;
 import org.apache.james.smtpserver.netty.SMTPResponseEncoder;
-import org.jboss.netty.channel.ChannelPipeline;
-import org.jboss.netty.channel.ChannelPipelineFactory;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
-import org.jboss.netty.channel.group.ChannelGroup;
 import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
 
 public class LMTPServer extends AbstractConfigurableAsyncServer implements LMTPServerMBean {
@@ -89,11 +85,6 @@ public class LMTPServer extends Abstract
         }
     }
 
-    @Override
-    protected ChannelPipelineFactory createPipelineFactory(ChannelGroup group) {
-        return new LMTPChannelPipelineFactory(getTimeout(), connectionLimit, connPerIP, group);
-    }
-
     /**
      * A class to provide SMTP handler configuration to the handlers
      */
@@ -163,41 +154,6 @@ public class LMTPServer extends Abstract
         }
     }
 
-    private final class LMTPChannelPipelineFactory extends AbstractSSLAwareChannelPipelineFactory {
-
-        public LMTPChannelPipelineFactory(int timeout, int maxConnections, int maxConnectsPerIp, ChannelGroup group) {
-            super(timeout, maxConnections, maxConnectsPerIp, group);
-        }
-
-        @Override
-        public ChannelPipeline getPipeline() throws Exception {
-            ChannelPipeline pipeLine = super.getPipeline();
-            pipeLine.addBefore("coreHandler", "countHandler", getConnectionCountHandler());
-            return pipeLine;
-        }
-
-        @Override
-        protected SSLContext getSSLContext() {
-            return null;
-        }
-
-        @Override
-        protected boolean isSSLSocket() {
-            return false;
-        }
-
-        @Override
-        protected OneToOneEncoder createEncoder() {
-            return new SMTPResponseEncoder();
-        }
-
-        @Override
-        protected ChannelUpstreamHandler createHandler() {
-            return new SMTPChannelUpstreamHandler(handlerChain, lmtpConfig, getLogger());
-        }
-
-    }
-
     /*
      * (non-Javadoc)
      * 
@@ -248,4 +204,24 @@ public class LMTPServer extends Abstract
         return lmtpConfig.getHelloName();
     }
 
+    @Override
+    protected ChannelUpstreamHandler createCoreHandler() {
+        return new SMTPChannelUpstreamHandler(handlerChain, lmtpConfig, getLogger());
+    }
+
+    @Override
+    protected OneToOneEncoder createEncoder() {
+        return new SMTPResponseEncoder();
+    }
+
+    @Override
+    protected SSLContext getSSLContext() {
+        return null;
+    }
+
+    @Override
+    protected boolean isSSLSocket() {
+        return false;
+    }
+
 }

Modified: james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/OioLMTPServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/OioLMTPServer.java?rev=1091822&r1=1091821&r2=1091822&view=diff
==============================================================================
--- james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/OioLMTPServer.java (original)
+++ james/server/trunk/lmtpserver/src/main/java/org/apache/james/lmtpserver/netty/OioLMTPServer.java Wed Apr 13 15:37:15 2011
@@ -20,6 +20,7 @@ package org.apache.james.lmtpserver.nett
 
 import org.jboss.netty.channel.socket.ServerSocketChannelFactory;
 import org.jboss.netty.channel.socket.oio.OioServerSocketChannelFactory;
+import org.jboss.netty.handler.execution.ExecutionHandler;
 
 /**
  * LMTPServer which use old IO and not NIO. If you want to use NIO you should
@@ -42,4 +43,14 @@ public class OioLMTPServer extends LMTPS
         return -1;
     }
 
+
+    /**
+     * As OIO use one thread per connection we disable the use of the {@link ExecutionHandler}
+     * 
+     */
+    @Override
+    protected ExecutionHandler createExecutionHander() {
+        return null;
+    }
+
 }

Modified: james/server/trunk/pop3server/pom.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/pom.xml?rev=1091822&r1=1091821&r2=1091822&view=diff
==============================================================================
--- james/server/trunk/pop3server/pom.xml (original)
+++ james/server/trunk/pop3server/pom.xml Wed Apr 13 15:37:15 2011
@@ -132,5 +132,11 @@
       <type>test-jar</type>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <version>1.6.1</version>
+      <scope>test</scope>
+    </dependency> 
   </dependencies>
 </project>
\ No newline at end of file

Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/POP3CommandDispatcherLineHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/POP3CommandDispatcherLineHandler.java?rev=1091822&r1=1091821&r2=1091822&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/POP3CommandDispatcherLineHandler.java (original)
+++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/POP3CommandDispatcherLineHandler.java Wed Apr 13 15:37:15 2011
@@ -64,7 +64,7 @@ public class POP3CommandDispatcherLineHa
         return UnknownCmdHandler.COMMAND_NAME;
     }
 
-    @Override
+    
     public boolean onLine(POP3Session session, byte[] line) {
         MailboxSession mSession = (MailboxSession) session.getState().get(POP3Session.MAILBOX_SESSION);
 

Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/OioPOP3Server.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/OioPOP3Server.java?rev=1091822&r1=1091821&r2=1091822&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/OioPOP3Server.java (original)
+++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/OioPOP3Server.java Wed Apr 13 15:37:15 2011
@@ -20,6 +20,7 @@ package org.apache.james.pop3server.nett
 
 import org.jboss.netty.channel.socket.ServerSocketChannelFactory;
 import org.jboss.netty.channel.socket.oio.OioServerSocketChannelFactory;
+import org.jboss.netty.handler.execution.ExecutionHandler;
 
 /**
  * POP3Server which use old IO and not NIO. If you want to use NIO you should
@@ -39,4 +40,15 @@ public class OioPOP3Server extends POP3S
     public int getIoWorkerCount() {
         return -1;
     }
+    
+
+    /**
+     * As OIO use one thread per connection we disable the use of the {@link ExecutionHandler}
+     * 
+     */
+    @Override
+    protected ExecutionHandler createExecutionHander() {
+        return null;
+    }
+
 }

Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java?rev=1091822&r1=1091821&r2=1091822&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java (original)
+++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3ChannelUpstreamHandler.java Wed Apr 13 15:37:15 2011
@@ -27,6 +27,7 @@ import org.apache.james.protocols.api.Pr
 import org.apache.james.protocols.impl.AbstractChannelUpstreamHandler;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
+import org.jboss.netty.channel.ExceptionEvent;
 import org.slf4j.Logger;
 
 /**
@@ -64,4 +65,10 @@ public class POP3ChannelUpstreamHandler 
         }
     }
 
+    @Override
+    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
+        e.getCause().printStackTrace();
+        //super.exceptionCaught(ctx, e);
+    }
+
 }

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=1091822&r1=1091821&r2=1091822&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 Wed Apr 13 15:37:15 2011
@@ -19,16 +19,11 @@
 package org.apache.james.pop3server.netty;
 
 import javax.annotation.Resource;
-import javax.net.ssl.SSLContext;
 
 import org.apache.james.pop3server.POP3HandlerConfigurationData;
 import org.apache.james.protocols.api.ProtocolHandlerChain;
-import org.apache.james.protocols.impl.AbstractSSLAwareChannelPipelineFactory;
 import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer;
-import org.jboss.netty.channel.ChannelPipeline;
-import org.jboss.netty.channel.ChannelPipelineFactory;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
-import org.jboss.netty.channel.group.ChannelGroup;
 import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
 
 /**
@@ -90,51 +85,18 @@ public class POP3Server extends Abstract
     }
 
     @Override
-    protected ChannelPipelineFactory createPipelineFactory(ChannelGroup group) {
-        return new POP3ChannelPipelineFactory(getTimeout(), connectionLimit, connPerIP, group);
+    protected String getDefaultJMXName() {
+        return "pop3server";
     }
 
-    private final class POP3ChannelPipelineFactory extends AbstractSSLAwareChannelPipelineFactory {
-
-        public POP3ChannelPipelineFactory(int timeout, int maxConnections, int maxConnectsPerIp, ChannelGroup group) {
-            super(timeout, maxConnections, maxConnectsPerIp, group);
-        }
-
-        @Override
-        public ChannelPipeline getPipeline() throws Exception {
-            ChannelPipeline pipeLine = super.getPipeline();
-            pipeLine.addBefore("coreHandler", "countHandler", getConnectionCountHandler());
-            return pipeLine;
-        }
-
-        @Override
-        protected SSLContext getSSLContext() {
-            return POP3Server.this.getSSLContext();
-
-        }
-
-        @Override
-        protected boolean isSSLSocket() {
-            return POP3Server.this.isSSLSocket();
-        }
-
-        @Override
-        protected OneToOneEncoder createEncoder() {
-            return new POP3ResponseEncoder();
-
-        }
-
-        @Override
-        protected ChannelUpstreamHandler createHandler() {
-            return new POP3ChannelUpstreamHandler(handlerChain, theConfigData, getLogger(), getSSLContext(), getEnabledCipherSuites());
-
-        }
-
+    @Override
+    protected ChannelUpstreamHandler createCoreHandler() {
+        return new POP3ChannelUpstreamHandler(handlerChain, theConfigData, getLogger(), getSSLContext(), getEnabledCipherSuites());
     }
 
     @Override
-    protected String getDefaultJMXName() {
-        return "pop3server";
+    protected OneToOneEncoder createEncoder() {
+        return new POP3ResponseEncoder();
     }
 
 }

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=1091822&r1=1091821&r2=1091822&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 Wed Apr 13 15:37:15 2011
@@ -162,13 +162,16 @@ public class POP3ServerTest extends Test
     }
 
     protected void tearDown() throws Exception {
-
+        try {
         if (m_pop3Protocol != null) {
             if (m_pop3Protocol.isConnected()) {
                 m_pop3Protocol.sendCommand("quit");
                 m_pop3Protocol.disconnect();
             }
         }
+        } catch (Exception e){
+            
+        }
 
         manager.deleteEverything();
         // manager.deleteAll();
@@ -405,8 +408,8 @@ public class POP3ServerTest extends Test
         deleted = m_pop3Protocol.deleteMessage(10);
         assertFalse(deleted);
 
-        m_pop3Protocol.sendCommand("quit");
-        m_pop3Protocol.disconnect();
+        m_pop3Protocol.logout();
+        //m_pop3Protocol.disconnect();
 
         m_pop3Protocol.connect("127.0.0.1", m_pop3ListenerPort);
 

Modified: james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java?rev=1091822&r1=1091821&r2=1091822&view=diff
==============================================================================
--- james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java (original)
+++ james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractConfigurableAsyncServer.java Wed Apr 13 15:37:15 2011
@@ -40,10 +40,17 @@ import org.apache.james.dnsservice.api.D
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.lifecycle.api.Configurable;
 import org.apache.james.lifecycle.api.LogEnabled;
+
 import org.apache.james.protocols.impl.AbstractAsyncServer;
 import org.apache.james.protocols.lib.jmx.ServerMBean;
 import org.apache.james.util.concurrent.JMXEnabledThreadPoolExecutor;
 import org.jboss.netty.bootstrap.ServerBootstrap;
+import org.jboss.netty.channel.ChannelPipelineFactory;
+import org.jboss.netty.channel.ChannelUpstreamHandler;
+import org.jboss.netty.channel.group.ChannelGroup;
+import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
+import org.jboss.netty.handler.execution.ExecutionHandler;
+import org.jboss.netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor;
 import org.slf4j.Logger;
 
 /**
@@ -102,6 +109,11 @@ public abstract class AbstractConfigurab
 
     private ConnectionCountHandler countHandler = new ConnectionCountHandler();
 
+    private ExecutionHandler executionHandler = null;
+
+    private int maxExecutorThreads;
+
+    
     @Resource(name = "dnsservice")
     public final void setDNSService(DNSService dns) {
         this.dns = dns;
@@ -166,6 +178,9 @@ public abstract class AbstractConfigurab
         int ioWorker = config.getInt("ioWorkerCount", DEFAULT_IO_WORKER_COUNT);
         setIoWorkerCount(ioWorker);
 
+        maxExecutorThreads = config.getInt("maxExecutorCount", 50);
+
+        
         configureHelloName(config);
 
         setTimeout(config.getInt(TIMEOUT_NAME, DEFAULT_TIMEOUT));
@@ -235,7 +250,7 @@ public abstract class AbstractConfigurab
         if (isEnabled()) {
             preInit();
             buildSSLContext();
-
+            executionHandler = createExecutionHander();
             bind();
         }
     }
@@ -245,6 +260,9 @@ public abstract class AbstractConfigurab
         getLogger().info("Dispose " + getServiceType());
         if (isEnabled()) {
             unbind();
+            if (executionHandler != null) {
+                executionHandler.releaseExternalResources();
+            }
         }
     }
 
@@ -536,5 +554,67 @@ public abstract class AbstractConfigurab
         // enable tcp keep-alives
         bootstrap.setOption("child.keepAlive", true);
     }
+    
+    /**
+     * Create a new {@link ExecutionHandler} which is used to execute IO-Bound handlers
+     * 
+     * @return ehandler
+     */
+    protected ExecutionHandler createExecutionHander() {
+        return new ExecutionHandler(new OrderedMemoryAwareThreadPoolExecutor(maxExecutorThreads, 0, 0));
+    }
+
+    /**
+     * Return the {@link ExecutionHandler} or null if non should be used. Be sure you call {@link #createExecutionHander()} before
+     * 
+     * @return ehandler
+     */
+    protected ExecutionHandler getExecutionHandler() {
+        return executionHandler;
+    }
+    
+    protected abstract OneToOneEncoder createEncoder();
 
+    protected abstract ChannelUpstreamHandler createCoreHandler();
+    
+    @Override
+    protected ChannelPipelineFactory createPipelineFactory(ChannelGroup group) {
+        return new AbstractExecutorAwareChannelPipelineFactory(connPerIP, connPerIP, connPerIP, group, enabledCipherSuites) {
+            @Override
+            protected SSLContext getSSLContext() {
+                return AbstractConfigurableAsyncServer.this.getSSLContext();
+
+            }
+
+            @Override
+            protected boolean isSSLSocket() {
+                return AbstractConfigurableAsyncServer.this.isSSLSocket();
+            }
+
+            @Override
+            protected OneToOneEncoder createEncoder() {
+                return AbstractConfigurableAsyncServer.this.createEncoder();
+
+            }
+
+            @Override
+            protected ChannelUpstreamHandler createHandler() {
+                return AbstractConfigurableAsyncServer.this.createCoreHandler();
+
+            }
+
+            @Override
+            protected ConnectionCountHandler getConnectionCountHandler() {
+                return AbstractConfigurableAsyncServer.this.getConnectionCountHandler();
+            }
+
+            @Override
+            protected ExecutionHandler getExecutionHandler() {
+                return AbstractConfigurableAsyncServer.this.getExecutionHandler();
+            }
+
+        };
+    }
+    
+    
 }

Added: james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractExecutorAwareChannelPipelineFactory.java
URL: http://svn.apache.org/viewvc/james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractExecutorAwareChannelPipelineFactory.java?rev=1091822&view=auto
==============================================================================
--- james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractExecutorAwareChannelPipelineFactory.java (added)
+++ james/server/trunk/protocols-library/src/main/java/org/apache/james/protocols/lib/netty/AbstractExecutorAwareChannelPipelineFactory.java Wed Apr 13 15:37:15 2011
@@ -0,0 +1,49 @@
+/****************************************************************
+ * 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.protocols.lib.netty;
+
+import org.apache.james.protocols.impl.AbstractSSLAwareChannelPipelineFactory;
+import org.jboss.netty.channel.ChannelPipeline;
+import org.jboss.netty.channel.group.ChannelGroup;
+import org.jboss.netty.handler.execution.ExecutionHandler;
+
+public abstract class AbstractExecutorAwareChannelPipelineFactory extends AbstractSSLAwareChannelPipelineFactory{
+
+
+    public AbstractExecutorAwareChannelPipelineFactory(int timeout, int maxConnections, int maxConnectsPerIp, ChannelGroup group) {
+        super(timeout, maxConnections, maxConnectsPerIp, group);
+    }
+    public AbstractExecutorAwareChannelPipelineFactory(int timeout, int maxConnections, int maxConnectsPerIp, ChannelGroup group, String[] enabledCipherSuites) {
+        super(timeout, maxConnections, maxConnectsPerIp, group, enabledCipherSuites);
+    }
+    @Override
+    public ChannelPipeline getPipeline() throws Exception {
+        ChannelPipeline pipeLine = super.getPipeline();
+        pipeLine.addBefore("coreHandler", "countHandler", getConnectionCountHandler());
+        ExecutionHandler ehandler = getExecutionHandler();
+        if (ehandler != null) {
+            pipeLine.addBefore("coreHandler", "executionHandler", ehandler);
+        }
+        return pipeLine;
+    }
+
+    protected abstract ExecutionHandler getExecutionHandler();
+    
+    protected abstract ConnectionCountHandler getConnectionCountHandler();
+}

Modified: james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/OioSMTPServer.java
URL: http://svn.apache.org/viewvc/james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/OioSMTPServer.java?rev=1091822&r1=1091821&r2=1091822&view=diff
==============================================================================
--- james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/OioSMTPServer.java (original)
+++ james/server/trunk/smtpserver/src/main/java/org/apache/james/smtpserver/netty/OioSMTPServer.java Wed Apr 13 15:37:15 2011
@@ -20,6 +20,7 @@ package org.apache.james.smtpserver.nett
 
 import org.jboss.netty.channel.socket.ServerSocketChannelFactory;
 import org.jboss.netty.channel.socket.oio.OioServerSocketChannelFactory;
+import org.jboss.netty.handler.execution.ExecutionHandler;
 
 /**
  * SMTPServer which use old IO and not NIO. If you want to use NIO you should
@@ -40,4 +41,13 @@ public class OioSMTPServer extends SMTPS
         return -1;
     }
 
+
+    /**
+     * As OIO use one thread per connection we disable the use of the {@link ExecutionHandler}
+     * 
+     */
+    @Override
+    protected ExecutionHandler createExecutionHander() {
+        return null;
+    }
 }

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=1091822&r1=1091821&r2=1091822&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 Wed Apr 13 15:37:15 2011
@@ -19,19 +19,14 @@
 package org.apache.james.smtpserver.netty;
 
 import javax.annotation.Resource;
-import javax.net.ssl.SSLContext;
 
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.james.dnsservice.library.netmatcher.NetMatcher;
 import org.apache.james.protocols.api.ProtocolHandlerChain;
-import org.apache.james.protocols.impl.AbstractSSLAwareChannelPipelineFactory;
 import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer;
 import org.apache.james.protocols.smtp.SMTPConfiguration;
-import org.jboss.netty.channel.ChannelPipeline;
-import org.jboss.netty.channel.ChannelPipelineFactory;
 import org.jboss.netty.channel.ChannelUpstreamHandler;
-import org.jboss.netty.channel.group.ChannelGroup;
 import org.jboss.netty.handler.codec.oneone.OneToOneEncoder;
 
 /**
@@ -273,47 +268,6 @@ public class SMTPServer extends Abstract
 
     }
 
-    @Override
-    protected ChannelPipelineFactory createPipelineFactory(ChannelGroup group) {
-        return new SMTPChannelPipelineFactory(getTimeout(), connectionLimit, connPerIP, group, getEnabledCipherSuites());
-    }
-
-    private final class SMTPChannelPipelineFactory extends AbstractSSLAwareChannelPipelineFactory {
-
-        public SMTPChannelPipelineFactory(int timeout, int maxConnections, int maxConnectsPerIp, ChannelGroup group, String[] enabledCipherSuites) {
-            super(timeout, maxConnections, maxConnectsPerIp, group, enabledCipherSuites);
-        }
-
-        @Override
-        public ChannelPipeline getPipeline() throws Exception {
-            ChannelPipeline pipeline = super.getPipeline();
-            pipeline.addBefore("coreHandler", "connectionCount", getConnectionCountHandler());
-
-            return pipeline;
-        }
-
-        @Override
-        protected SSLContext getSSLContext() {
-            return SMTPServer.this.getSSLContext();
-        }
-
-        @Override
-        protected boolean isSSLSocket() {
-            return SMTPServer.this.isSSLSocket();
-        }
-
-        @Override
-        protected OneToOneEncoder createEncoder() {
-            return new SMTPResponseEncoder();
-        }
-
-        @Override
-        protected ChannelUpstreamHandler createHandler() {
-            return new SMTPChannelUpstreamHandler(handlerChain, theConfigData, getLogger(), getSSLContext(), getEnabledCipherSuites());
-        }
-
-    }
-
     /*
      * (non-Javadoc)
      * 
@@ -405,4 +359,14 @@ public class SMTPServer extends Abstract
         return theConfigData.getHelloName();
     }
 
+    @Override
+    protected ChannelUpstreamHandler createCoreHandler() {
+        return new SMTPChannelUpstreamHandler(handlerChain, theConfigData, getLogger(), getSSLContext(), getEnabledCipherSuites());
+    }
+
+    @Override
+    protected OneToOneEncoder createEncoder() {
+        return new SMTPResponseEncoder();
+    }
+
 }



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