2010-09-16 86 views
12

我有一个netty通道,我想在底层套接字上设置一个超时(默认设置为0)。在netty通道上设置套接字超时

超时的目的是,如果在15分钟内没有任何事情发生,未使用的通道将被关闭。

虽然我没有看到任何配置这样做,并且套接字本身也对我隐藏。

由于

回答

13

如果使用ReadTimeoutHandler类,超时可以被控制。

以下是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)); 
... 

当将导致超时,MyHandler.exceptionCaught(ChannelHandlerContext CTX,ExceptionEvent e)的调用ReadTimeoutException

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