奇怪的网络行为:获得了一个服务器频道,该频道需要心跳并通过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());
}
如果客户端无法发送心跳,一切正常 - 触发并处理超时。但是,如果我粗暴地杀死客户端,相当于断开电缆,Netty不会触发超时。
使用Netty的超时异常(而不是空闲事件)具有相同的结果。
答案 0 :(得分:0)
结果显示Netty确实识别了频道丢弃,它只是没有触发死信道的超时。要为相关频道上下文检测此调用channelHandlerContext.isRemoved()
。