【发布时间】:2014-07-14 13:57:16
【问题描述】:
我有扩展 SimpleChannelInboundHandler 的处理程序。我用它来处理 websocket 帧。 检测从客户端关闭连接(浏览器关闭或网络连接崩溃)的最佳方法是什么? 我看到 ChannelInboundHandlerAdapter 中有两种方法:channelUnregistered 和 channelInactive。我可以用它来检测通道关闭吗?
【问题讨论】:
我有扩展 SimpleChannelInboundHandler 的处理程序。我用它来处理 websocket 帧。 检测从客户端关闭连接(浏览器关闭或网络连接崩溃)的最佳方法是什么? 我看到 ChannelInboundHandlerAdapter 中有两种方法:channelUnregistered 和 channelInactive。我可以用它来检测通道关闭吗?
【问题讨论】:
您应该使用channelInactive(),它在通道无法再进行通信时触发。 channelUnregistered() 有不同的含义,虽然channelUnregistered() 总是在channelInactive() 之后触发。
【讨论】:
ctx.fireChannelInactive() 或ctx.fireChannelUnregistered() 转发事件?
channelUnregistered() 在连接尝试不成功的情况下也会被调用。所以channelInactive() 似乎是监听连接关闭事件的更好选择。
我刚刚在实施重新连接策略时看到了这一点,其中关闭的连接会触发重新连接。 channelUnregistered() 是我的第一选择,显然是错误的,因为它会在每次重新连接后重新触发重新连接,无休止。
顺便说一句:我还测试了 websocket 连接。
【讨论】:
我使用 netty 4 channelUnregistered
也许你担心日志上的警告,我解决了它改变日志级别,因为它已经被方法处理但总是出现
<logger name="io.netty" additivity="false">
<level value="ERROR" />
<appender-ref ref="console" />
</logger>
【讨论】: