Specifying Accept Timeouts on Server Sockets

"이희승 (Trustin Lee)" trustin at gmail.com
Thu Aug 26 01:11:02 EDT 2010


The code looks fine, but I'd simply use HashedWheelTimer directly
instead of using IdleStateHandler for even more simplicity:

    HashedWheelTimer timer = ...;
    Channel serverChannel = bootstrap.bind(...);
    timer.newTimeout(new TimerTask() { ... serverChannel.close(); }, ...);

HTH,
Trustin

On 08/14/2010 12:57 AM, Sai Pullabhotla wrote:
> I think I got it to work now. Just to make sure I'm doing it the
> correct way, below is the example code. If it should have been done
> differently, please let me know.
> 
> import java.net.InetSocketAddress;
> import java.util.concurrent.ExecutorService;
> import java.util.concurrent.Executors;
> 
> import org.jboss.netty.bootstrap.ServerBootstrap;
> import org.jboss.netty.channel.Channel;
> import org.jboss.netty.channel.ChannelHandlerContext;
> import org.jboss.netty.channel.ChannelStateEvent;
> import org.jboss.netty.channel.ChildChannelStateEvent;
> import org.jboss.netty.channel.MessageEvent;
> import org.jboss.netty.channel.socket.ServerSocketChannelFactory;
> import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
> import org.jboss.netty.handler.timeout.IdleState;
> import org.jboss.netty.handler.timeout.IdleStateAwareChannelHandler;
> import org.jboss.netty.handler.timeout.IdleStateEvent;
> import org.jboss.netty.handler.timeout.IdleStateHandler;
> import org.jboss.netty.util.HashedWheelTimer;
> import org.jboss.netty.util.Timer;
> 
> public class NettyAcceptTimeoutTest {
> 
> 	public static void main(String[] args) {
> 		ExecutorService service = Executors.newCachedThreadPool();
> 		ServerSocketChannelFactory factory = new NioServerSocketChannelFactory(
> 			service, service);
> 		ServerBootstrap bootstrap = new ServerBootstrap(factory);
> 		HashedWheelTimer idleTimer = new HashedWheelTimer();
> 		//Here is where we handle accept timeouts
> 		bootstrap.setParentHandler(new ParentHandler(idleTimer, 0, 0, 10));
> 		//Here is where we handle read/write timeouts on child channels
> 		bootstrap.getPipeline().addLast("idleHandler",
> 			new IdleStateHandler(idleTimer, 60, 30, 30));
> 		bootstrap.getPipeline().addLast("handler", new ChildHandler());
> 		bootstrap.bind(new InetSocketAddress(3000));
> 	}
> 
> 	private static class ParentHandler extends IdleStateHandler {
> 
> 		public ParentHandler(Timer timer, int readerIdleTimeSeconds,
> 			int writerIdleTimeSeconds, int allIdleTimeSeconds) {
> 			super(timer, readerIdleTimeSeconds, writerIdleTimeSeconds,
> 				allIdleTimeSeconds);
> 		}
> 
> 		@Override
> 		protected void channelIdle(ChannelHandlerContext ctx, IdleState state,
> 			long lastActivityTimeMillis) throws Exception {
> 			super.channelIdle(ctx, state, lastActivityTimeMillis);
> 			System.out.println("Acceptor Idle, unbinding " + state);
> 			ctx.getChannel().close();
> 		}
> 
> 		@Override
> 		public void channelBound(ChannelHandlerContext ctx, ChannelStateEvent e)
> 			throws Exception {
> 			System.out.println("Channel bound");
> 		}
> 
> 		@Override
> 		public void channelUnbound(ChannelHandlerContext ctx,
> 			ChannelStateEvent e) throws Exception {
> 			System.out.println("Channel unbound");
> 		}
> 
> 		@Override
> 		public void childChannelOpen(ChannelHandlerContext ctx,
> 			ChildChannelStateEvent e) throws Exception {
> 			System.out.println("Child channel opened");
> 		}
> 
> 		@Override
> 		public void childChannelClosed(ChannelHandlerContext ctx,
> 			ChildChannelStateEvent e) throws Exception {
> 			System.out.println("Child channel closed");
> 		}
> 
> 	}
> 
> 	private static class ChildHandler extends IdleStateAwareChannelHandler {
> 
> 		@Override
> 		public void channelConnected(ChannelHandlerContext ctx,
> 			ChannelStateEvent e) throws Exception {
> 			System.out.println("Child Channel connected");
> 		}
> 
> 		@Override
> 		public void channelDisconnected(ChannelHandlerContext ctx,
> 			ChannelStateEvent e) throws Exception {
> 			System.out.println("Child Channel Disconnected");
> 		}
> 
> 		@Override
> 		public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
> 			throws Exception {
> 			System.out.println("Message Received");
> 			e.getChannel().write(e.getMessage());
> 		}
> 
> 		@Override
> 		public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e)
> 			throws Exception {
> 			System.out.println("Child Channel Idle, closing connection");
> 			e.getChannel().close();
> 		}
> 	}
> 
> }
> 
> On Fri, Aug 13, 2010 at 10:01 AM, Sai Pullabhotla
> <sai.pullabhotla at jmethods.com> wrote:
>> Well, that's what I thought, but it did not work. It looks like the
>> IdleStateHandlers are working only for read and write timeouts, but
>> not for accept timeouts.
>>
>> Correct me if I'm wrong, but I think the accept timeouts should be
>> handled by the parent handler of a Bootstrap, not by the channel
>> pipeline that the child channels use. Is this correct? Could some one
>> give me some hints on how to get this working?
>>
>> 2010/8/13 Marc-André Laverdière <marcandre.laverdiere at gmail.com>:
>>> You could always have a timeout handler.
>>>
>>> Marc-André LAVERDIÈRE
>>> "Perseverance must finish its work so that you may be mature and
>>> complete, not lacking anything." -James 1:4
>>> mlaverd.theunixplace.com/blog
>>>
>>>  /"\
>>>  \ /    ASCII Ribbon Campaign
>>>   X      against HTML e-mail
>>>  / \
>>>
>>>
>>>
>>> 2010/8/12 Sai Pullabhotla <sai.pullabhotla at jmethods.com>:
>>>> Hello,
>>>>
>>>> Is there a way to specify accept timeouts on server sockets? For
>>>> example, an FTP server would typically listen on a random port in
>>>> response to a PASV command from the client. If for some reason, the
>>>> client does not open the connection to this passive port in a
>>>> specified amount of time, I would like to shutdown the listener and
>>>> free up the port/resources. Java's plain ServerSockets make use of the
>>>> SO_TIMEOUT methods to achieve this. But, I did not find any equivalent
>>>> in Netty. Can some one tell me if this is supported and steer me in
>>>> the right direction?
>>>>
>>>> Thanks in advance for your help.
>>>> Sai.
>>>> _______________________________________________
>>>> netty-users mailing list
>>>> netty-users at lists.jboss.org
>>>> https://lists.jboss.org/mailman/listinfo/netty-users
>>>>
>>>
>>> _______________________________________________
>>> netty-users mailing list
>>> netty-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/netty-users
>>
> 
> _______________________________________________
> netty-users mailing list
> netty-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/netty-users

-- 
what we call human nature in actuality is human habit
http://gleamynode.net/

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 293 bytes
Desc: OpenPGP digital signature
Url : http://lists.jboss.org/pipermail/netty-users/attachments/20100826/553017cf/attachment-0001.bin 


More information about the netty-users mailing list