2010-09-16 2 views
12

У меня есть нетто-канал, и я бы хотел установить тайм-аут в базовом сокете (по умолчанию он установлен в 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 е) вызывается с ReadTimeoutException.

@Override 
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) { 
    if (e.getCause() instanceof ReadTimeoutException) { 
     // NOP 
    } 
    ctx.getChannel().close(); 
} 
Смежные вопросы