Установка времени ожидания сокета на канале netty - PullRequest
16 голосов
/ 16 сентября 2010

У меня нетканальный канал, и я хотел бы установить тайм-аут на базовый сокет (по умолчанию он равен 0).

Цель тайм-аута - закрытие неиспользуемого каналанапример, если в течение 15 минут ничего не происходит.

Хотя я не вижу никакой конфигурации для этого, и сама розетка также скрыта от меня.

Спасибо

1 Ответ

15 голосов
/ 18 февраля 2011

Если используется класс 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();
}
...