奇怪的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()
。