Setting socket timeout on netty channel

Roman picture Roman · Sep 16, 2010 · Viewed 17.1k times · Source

I have a netty channel and I would like to set a timeout on the underlying socket ( it is set by default to 0 ).

The purpose of the timeout is that the not used channel will be closed if nothing is happening for 15 minutes for instance.

Although I dont see any configuration to do so , and the socket itself is also hidden from me.

Thanks

Answer

Yu Sun corn picture Yu Sun corn · Feb 18, 2011

If ReadTimeoutHandler class is used, the time-out can be controlled.

Following is a quotation from Javadoc.

public class MyPipelineFactory implements ChannelPipelineFactory {
    private final Timer timer;
    public MyPipelineFactory(Timer timer) {
        this.timer = timer;
    }

    public ChannelPipeline getPipeline() {
        // An example configuration that implements 30-second read timeout:
        return Channels.pipeline(
            new ReadTimeoutHandler(timer, 30), // timer must be shared.
            new MyHandler());
    }
}


ServerBootstrap bootstrap = ...;
Timer timer = new HashedWheelTimer();
...
bootstrap.setPipelineFactory(new MyPipelineFactory(timer));
...

When it will cause a time-out, MyHandler.exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) is called with ReadTimeoutException.

@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
    if (e.getCause() instanceof ReadTimeoutException) {
        // NOP
    }
    ctx.getChannel().close();
}