java - 在读取超时时写入 channel

标签 java netty

每当我发现 Reader Idle 超时时,我都想写超时错误。

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);
             } 
         }
}

处理程序正在工作,但没有任何内容写入 channel 。这种情况可能吗?

更新:

我的管道工厂:

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

最佳答案

您的管道配置错误。任何写入 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());

关于java - 在读取超时时写入 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9916956/

相关文章:

java - 在 Java 中检查 MM-dd-yyyy 和 dd-MM-yyyy 格式

java - 意外的 Java 功能接口(interface)转换

java - 通过 JNI 将数据从 C 传递到 Java 的快速方法

java - Mybatis If 语句使用 include 属性

java - 帮助在 Tomcat 5.5.x 中使用嵌入式 JBoss 配置 JNDI

apache-spark - Spark 2.3.0 netty版本问题: NoSuchMethod io.netty.buffer.PooledByteBufAllocator.metric()

sockets - jmeter - 异步 TCP 采样器选项?

java - Netty - getRemoteAddress 每次返回不同的端口

java - 15GB 后数据传输速率变慢,用于更大的文件传输

java - 使用 Netty HTTP 客户端重试请求