2012-03-28 3 views
2

리더 유휴 시간 제한을 잡을 때마다 시간 초과 오류를 작성하고 싶습니다.읽기 타임 아웃시 채널에 쓰기

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; 
    } 
} 
+0

ChannelPipeline을 보여줄 수 있습니까? –

+0

예. 부디. 내 업데이트보기 –

+0

나에게 잘 어울리는 군. wireshark로 트래픽을 확인 했습니까? –

답변

1

파이프 라인은 잘못이다. 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());