Author: norman
Date: Wed Mar 30 10:41:19 2011
New Revision: 1086900
URL: http://svn.apache.org/viewvc?rev=1086900&view=rev
Log:
Only disconnect client if it not receive or send any data in a given timeframe.
This is part of IMAP-272
Added:
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
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=1086900&r1=1086899&r2=1086900&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 Mar 30 10:41:19 2011
@@ -20,6 +20,8 @@ package org.apache.james.imapserver.nett
import static org.jboss.netty.channel.Channels.pipeline;
+import java.util.concurrent.TimeUnit;
+
import javax.annotation.Resource;
import javax.net.ssl.SSLEngine;
@@ -30,7 +32,6 @@ import org.apache.james.imap.api.process
import org.apache.james.imap.decode.ImapDecoder;
import org.apache.james.imap.encode.ImapEncoder;
import org.apache.james.protocols.impl.ChannelGroupHandler;
-import org.apache.james.protocols.impl.TimeoutHandler;
import org.apache.james.protocols.lib.netty.AbstractConfigurableAsyncServer;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
@@ -118,12 +119,13 @@ public class IMAPServer extends Abstract
private final HashedWheelTimer timer = new HashedWheelTimer();
// Timeout of 30 minutes See rfc2060 5.4 for details
- private final static int TIMEOUT = 30 * 60;
+ private final static int TIMEOUT = 60;
+ private final TimeUnit TIMEOUT_UNIT = TimeUnit.MINUTES;
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = pipeline();
pipeline.addLast(GROUP_HANDLER, groupHandler);
- pipeline.addLast(TIMEOUT_HANDLER, new TimeoutHandler(timer,
TIMEOUT));
+ pipeline.addLast(TIMEOUT_HANDLER, new
ImapIdleStateHandler(timer, TIMEOUT, TIMEOUT_UNIT));
pipeline.addLast(CONNECTION_LIMIT_HANDLER, new
ConnectionLimitUpstreamHandler(IMAPServer.this.connectionLimit));
pipeline.addLast(CONNECTION_LIMIT_PER_IP_HANDLER, new
ConnectionPerIpLimitUpstreamHandler(IMAPServer.this.connPerIP));
Added:
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=1086900&view=auto
==============================================================================
---
james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapIdleStateHandler.java
(added)
+++
james/server/trunk/imapserver/src/main/java/org/apache/james/imapserver/netty/ImapIdleStateHandler.java
Wed Mar 30 10:41:19 2011
@@ -0,0 +1,60 @@
+/****************************************************************
+ * 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 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;
+
+/**
+ * {@link IdleStateHandler} 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);
+ }
+
+ @Override
+ protected void channelIdle(ChannelHandlerContext ctx, IdleState state,
+ long lastActivityTimeMillis) throws Exception {
+
+ // check if the client did nothing for too long
+ if (state.equals(IdleState.ALL_IDLE)) {
+ ImapSession session = (ImapSession)
attributes.get(ctx.getChannel());
+ InetSocketAddress address = (InetSocketAddress)
ctx.getChannel().getRemoteAddress();
+
+
+ session.getLog().info("Logout client "+ address.getHostName() +
" (" + address.getAddress().getHostAddress()+ ") because it idled for too
long...");
+
+ // logout the client
+ session.logout();
+
+ }
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]