【问题标题】:Adding and Removing Write Idlestatehandler添加和删​​除写空闲状态处理程序
【发布时间】:2016-03-17 18:36:07
【问题描述】:

在我基于 Netty 的 Http Server 中,我添加了

@Override
protected void initChannel(Channel channel) throws Exception {
    ChannelPipeline pipeline = channel.pipeline();
    pipeline.addLast("KeepAlive_Handler", new IdleStateHandler(readTimeout, 0, 0));
    pipeline.addLast("Timeout_Handler", new IdleStateHandler(0, writeTimeOut, 0));

    addSSLServerHandler(pipeline);
    pipeline.addLast("http-decoder", new HttpRequestDecoder(4096, 16384, 16384));
    pipeline.addLast("http-encoder", new HttpResponseEncoder());

    pipeline.addLast("Reuqest_Handler", new RequestHandler());
}

在 RequestHandler 中,处理 Http 请求后,即向客户端发送响应后,我从管道中删除“Timeout_Handler”,并且通道连接保持打开状态,除非发生 KeepAlive_Handler 事件或抛出一些致命异常。

我不确定的是来自 ChannelInitializer 的 initChannel() 总是为每个 Http 请求调用,或者在某些情况下它没有被调用?这很重要,因为我在每个 Http 请求之后都删除了“Timeout_Handler”,并且如果没有为某些 Http 请求调用 initChannel(),那么肯定会在没有“Timeout_Handler”的情况下处理这些请求。

【问题讨论】:

  • initChannel 在创建新通道(连接)时被调用,而不是在请求之间。

标签: netty


【解决方案1】:

initChannel(...) 为每个表示连接的新 Channel 调用。所以不,它不是按请求调用的。

【讨论】:

  • 如何确保对于每个请求(包括 ssl-handshake),当我的服务器读取第一个字节时,“写超时处理程序”被添加到管道以及请求完成时(无论响应如何),这个“写超时处理程序”被删除了???换句话说,每个请求都必须有一个新的“写超时处理程序”实例
猜你喜欢
  • 2018-10-09
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 2017-10-03
  • 2012-05-10
  • 1970-01-01
  • 2012-02-11
  • 2018-04-11
相关资源
最近更新 更多