具体而言,我对通道的另一端意外死亡(例如,进程被杀死)的情况感兴趣。似乎netty无法可靠地触发通道关闭/断开事件,有时它会发生,有时它不会。它也不一定会为连接重置抛出SocketException。
为了它的价值,我也尝试写入频道,但这也继续工作,不会抛出异常或解雇任何其他事件。
我在Windows上测试这个,netty 3.3.0.Final,如果这有任何区别。
答案 0 :(得分:1)
如果一个通道在没有发送关闭的情况下断开连接,则无法检测到它。通常,检测到断开连接(如果需要)的最佳方法是每隔x秒定期在通道上发送心跳事件。使用IdleStateHandler,如果您在心跳+增量后仍未收到心跳,则会强制断开通道。
答案 1 :(得分:0)
尝试使用 ChannelInboundHandlerAdapter 类中的 channelUnregistered 方法。
public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
ctx.fireChannelUnregistered();
//Your logic goes here...
}