2012-03-28 22 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()); 
関連する問題