Записать в канал на время чтения - PullRequest
2 голосов
/ 29 марта 2012

Я хотел бы записать ошибку тайм-аута всякий раз, когда я получаю Reader Idle time out.

public class TimeOutHandler extends IdleStateAwareChannelHandler {

      @Override
         public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e) {
             if (e.getState() == IdleState.READER_IDLE) {
                 System.out.println("Reader TimeOut");
                    HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
                    response.setHeader(Names.CONTENT_TYPE, "application/json; charset=UTF-8");
                    response.setContent(ChannelBuffers.copiedBuffer("{\"timeout\":true}", CharsetUtil.UTF_8));
                     ChannelFuture future = e.getChannel().write(response);
                     future.addListener(ChannelFutureListener.CLOSE);
             } 
         }
}

Обработчик работает, но на канал ничего не записывается. Возможен ли такой сценарий?

Обновление:

Мой трубопроводный завод:

public class AsyncServerPipelineFactory implements ChannelPipelineFactory {

    static HashedWheelTimer timer = new HashedWheelTimer();

    private final ChannelHandler idleStateHandler = new IdleStateHandler(timer, 10, 20, 0);
    public ChannelPipeline getPipeline() throws Exception {
        ChannelPipeline pipeline = Channels.pipeline( idleStateHandler,new TimeOutHandler());
     pipeline.addLast("decoder", new HttpRequestDecoder());
     pipeline.addLast("encoder", new HttpResponseEncoder());
     pipeline.addLast("handler", new HTTPRequestHandler());
    return pipeline;
    }
}

1 Ответ

1 голос
/ 26 сентября 2013

Ваш конвейер неправильно настроен. Любой обработчик, который записывает HttpResponse, должен быть вставлен после вашего HttpResponseEncoder. например

 ChannelPipeline pipeline = Channels.pipeline();
 pipeline.addLast("idler", idleStateHandler);
 pipeline.addLast("decoder", new HttpRequestDecoder());
 pipeline.addLast("encoder", new HttpResponseEncoder());
 pipeline.addLast("timer-outer", new TimeOutHandler());
 pipeline.addLast("handler", new HTTPRequestHandler());
...