Netty 在通道丢弃后未检测到超时



奇怪的Netty行为:获得了一个服务器通道,该通道期望心跳并捕获IdleStateHandler超时。结构如下:

@Override
public void initChannel(SocketChannel ch) throws Exception { 
    final ByteBuf delimiter = Unpooled.buffer(1); 
    long serverTimeout = 1000; 
    // Break input by newlines: 
    delimiter.writeByte('n'); 
    ch.pipeline().addLast(new DelimiterBasedFrameDecoder(32768, delimiter)); 
    // Use UTF8 string: 
    ch.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8)); 
    // Timeout
    ch.pipeline().addLast("idleStateHandler", new IdleStateHandler(serverTimeout, 0, 0, TimeUnit.MILLISECONDS)); 
    // Handle commands: 
    ch.pipeline().addLast("myHandler", new DBConnectionHandler()); 
}

如果客户端发送心跳失败,则一切正常——timeout被触发并处理。但是,如果我残忍地终止客户机,相当于断开电缆,Netty不会触发超时。

使用Netty的超时异常(而不是空闲事件)有相同的结果。

原来Netty确实可以识别信道丢失,它只是不会触发死信道的超时。要检测此情况,请为相关通道上下文调用channelHandlerContext.isRemoved()

相关内容

  • 没有找到相关文章

最新更新