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 20:35:45 UTC
svn commit: r1091877 - in
/james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty:
IMAPServer.java ImapChannelUpstreamHandler.java ImapHeartbeatHandler.java
ImapIdleStateHandler.java
Author: norman
Date: Wed Apr 13 18:35:45 2011
New Revision: 1091877
URL: http://svn.apache.org/viewvc?rev=1091877&view=rev
Log:
Send an heartbeat every 30 seconds while a processor is processing an IMAP command so the client will not close the connection. See IMAP-296
Added:
james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapHeartbeatHandler.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/ImapChannelUpstreamHandler.java
james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapIdleStateHandler.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=1091877&r1=1091876&r2=1091877&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 18:35:45 2011
@@ -45,6 +45,7 @@ import org.jboss.netty.handler.connectio
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.handler.timeout.IdleStateHandler;
import org.jboss.netty.util.HashedWheelTimer;
/**
@@ -129,7 +130,8 @@ public class IMAPServer extends Abstract
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = pipeline();
pipeline.addLast(GROUP_HANDLER, groupHandler);
- pipeline.addLast(TIMEOUT_HANDLER, new ImapIdleStateHandler(timer, TIMEOUT, TIMEOUT_UNIT));
+ pipeline.addLast("idleHandler", new IdleStateHandler(timer, 0, 30, TIMEOUT, TIMEOUT_UNIT));
+ pipeline.addLast(TIMEOUT_HANDLER, new ImapIdleStateHandler());
pipeline.addLast(CONNECTION_LIMIT_HANDLER, new ConnectionLimitUpstreamHandler(IMAPServer.this.connectionLimit));
pipeline.addLast(CONNECTION_LIMIT_PER_IP_HANDLER, new ConnectionPerIpLimitUpstreamHandler(IMAPServer.this.connPerIP));
Modified: james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapChannelUpstreamHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapChannelUpstreamHandler.java?rev=1091877&r1=1091876&r2=1091877&view=diff
==============================================================================
--- james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapChannelUpstreamHandler.java (original)
+++ james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapChannelUpstreamHandler.java Wed Apr 13 18:35:45 2011
@@ -62,6 +62,8 @@ public class ImapChannelUpstreamHandler
private ImapEncoder encoder;
+ private final ImapHeartbeatHandler heartbeatHandler = new ImapHeartbeatHandler();
+
public ImapChannelUpstreamHandler(final String hello, final ImapProcessor processor, ImapEncoder encoder, final Logger logger, boolean compress) {
this(hello, processor, encoder, logger, compress, null, null);
}
@@ -157,21 +159,26 @@ public class ImapChannelUpstreamHandler
ImapResponseComposer response = (ImapResponseComposer) ctx.getAttachment();
ImapMessage message = (ImapMessage) e.getMessage();
- final ResponseEncoder responseEncoder = new ResponseEncoder(encoder, response, session);
- processor.process(message, responseEncoder, session);
+ try {
+ ctx.getPipeline().addLast("heartbeatHandler", heartbeatHandler);
+ final ResponseEncoder responseEncoder = new ResponseEncoder(encoder, response, session);
+ processor.process(message, responseEncoder, session);
- if (session.getState() == ImapSessionState.LOGOUT) {
- ctx.getChannel().close();
- }
- final IOException failure = responseEncoder.getFailure();
+ if (session.getState() == ImapSessionState.LOGOUT) {
+ ctx.getChannel().close();
+ }
+ final IOException failure = responseEncoder.getFailure();
- if (failure != null) {
- final Logger logger = session.getLog();
- logger.info(failure.getMessage());
- if (logger.isDebugEnabled()) {
- logger.debug("Failed to write " + message, failure);
+ if (failure != null) {
+ final Logger logger = session.getLog();
+ logger.info(failure.getMessage());
+ if (logger.isDebugEnabled()) {
+ logger.debug("Failed to write " + message, failure);
+ }
+ throw failure;
}
- throw failure;
+ } finally {
+ ctx.getPipeline().remove("heartbeatHandler");
}
super.messageReceived(ctx, e);
Added: james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapHeartbeatHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapHeartbeatHandler.java?rev=1091877&view=auto
==============================================================================
--- james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapHeartbeatHandler.java (added)
+++ james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapHeartbeatHandler.java Wed Apr 13 18:35:45 2011
@@ -0,0 +1,37 @@
+/****************************************************************
+ * 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.imapserver.netty;
+
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.jboss.netty.channel.ChannelHandlerContext;
+import org.jboss.netty.handler.timeout.IdleState;
+import org.jboss.netty.handler.timeout.IdleStateAwareChannelHandler;
+import org.jboss.netty.handler.timeout.IdleStateEvent;
+
+public class ImapHeartbeatHandler extends IdleStateAwareChannelHandler{
+
+ @Override
+ public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e) throws Exception {
+ if (e.getState().equals(IdleState.WRITER_IDLE)) {
+ e.getChannel().write(ChannelBuffers.wrappedBuffer("* OK Hang in there..\r\n.".getBytes("US-ASCII")));
+ }
+ super.channelIdle(ctx, e);
+ }
+
+}
Modified: james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapIdleStateHandler.java
URL: http://svn.apache.org/viewvc/james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapIdleStateHandler.java?rev=1091877&r1=1091876&r2=1091877&view=diff
==============================================================================
--- james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapIdleStateHandler.java (original)
+++ james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapIdleStateHandler.java Wed Apr 13 18:35:45 2011
@@ -19,30 +19,25 @@
package org.apache.james.imapserver.netty;
import java.net.InetSocketAddress;
-import java.util.concurrent.TimeUnit;
import org.apache.james.imap.api.process.ImapSession;
import org.apache.james.protocols.impl.ChannelAttributeSupport;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.timeout.IdleState;
-import org.jboss.netty.handler.timeout.IdleStateHandler;
-import org.jboss.netty.util.Timer;
+import org.jboss.netty.handler.timeout.IdleStateAwareChannelHandler;
+import org.jboss.netty.handler.timeout.IdleStateEvent;
/**
- * {@link IdleStateHandler} which will call {@link ImapSession#logout()} if the
+ * {@link IdleStateAwareChannelHandler} which will call {@link ImapSession#logout()} if the
* connected client did not receive or send any traffic in a given timeframe
*/
-public class ImapIdleStateHandler extends IdleStateHandler implements ChannelAttributeSupport {
-
- public ImapIdleStateHandler(Timer timer, long allIdleTime, TimeUnit unit) {
- super(timer, 0, 0, allIdleTime, unit);
- }
+public class ImapIdleStateHandler extends IdleStateAwareChannelHandler implements ChannelAttributeSupport {
@Override
- protected void channelIdle(ChannelHandlerContext ctx, IdleState state, long lastActivityTimeMillis) throws Exception {
+ public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e) throws Exception {
// check if the client did nothing for too long
- if (state.equals(IdleState.ALL_IDLE)) {
+ if (e.getState().equals(IdleState.ALL_IDLE)) {
ImapSession session = (ImapSession) attributes.get(ctx.getChannel());
InetSocketAddress address = (InetSocketAddress) ctx.getChannel().getRemoteAddress();
@@ -55,6 +50,8 @@ public class ImapIdleStateHandler extend
ctx.getChannel().close();
}
+ super.channelIdle(ctx, e);
}
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org