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