我有一个扩展了SimpleChannelInboundHandler的处理程序,用于处理websocket帧。从客户端关闭连接的角度来看 (无论是浏览器关闭还是网络连接崩溃),检测连接关闭的最佳方法是什么?我发现在ChannelInboundHandlerAdapter中有两个方法:channelUnregistered和channelInactive。我能否使用它们来检测通道关闭?
当一个通道无法再进行通信时,您应该使用 channelInactive()
,它会触发。虽然channelUnregistered()
总是在channelInactive()
之后被触发,但其含义不同。
channelUnregistered()
在连接尝试失败的情况下也会被调用。因此,channelInactive()
似乎是更好的选择来监听连接关闭事件。
我在实现重新连接策略时看到了这个问题,其中关闭的连接会触发重新连接。channelUnregistered()
是我的第一选择,但显然是错误的,因为它会在每次重新连接后不断地重新触发重新连接。
顺便说一句:我还测试了 Websocket 连接。
使用Netty 4时,我使用channelUnregistered
也许你会担心日志上的警告,我通过更改日志级别来解决它,因为该方法已经处理了它,但总是出现
<logger name="io.netty" additivity="false">
<level value="ERROR" />
<appender-ref ref="console" />
</logger>
ctx.fireChannelInactive()
或ctx.fireChannelUnregistered()
来转发事件。 - trustin