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