Netty 如何实现心跳检测?
发布于
一、IdleStateHandler
Netty 提供 IdleStateHandler 检测空闲状态。
ch.pipeline().addLast(new IdleStateHandler(5, 0, 0, TimeUnit.SECONDS));
三个参数:读空闲时间、写空闲时间、所有空闲时间。
二、事件触发
- readerIdleTime 超时 → IdleStateEvent.READER_IDLE
- writerIdleTime 超时 → IdleStateEvent.WRITER_IDLE
- allIdleTime 超时 → IdleStateEvent.ALL_IDLE
三、处理心跳
public class HeartbeatHandler extends ChannelInboundHandlerAdapter {
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
if (evt instanceof IdleStateEvent) {
IdleState state = ((IdleStateEvent) evt).state();
if (state == IdleState.READER_IDLE) {
ctx.close(); // 读超时,断开连接
}
}
}
}
四、心跳机制
- 客户端定时发心跳包,服务端收到不响应或回响应。
- 服务端读超时未收到心跳,主动断开。
- 客户端写超时未收到响应,主动重连。
五、TCP keepalive
系统级 TCP keepalive 默认 2 小时,不适合业务心跳。应用层心跳更灵活。