| | |
| | | public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { |
| | | if (evt instanceof IdleStateEvent) { |
| | | IdleStateEvent event = (IdleStateEvent) evt; |
| | | long timestamp = System.currentTimeMillis(); |
| | | |
| | | switch (event.state()) { |
| | | case READER_IDLE: |
| | | log.debug("读空闲超时 - 可能服务器未响应"); |
| | | ctx.close(); // <-- 必须加这句 |
| | | //log.warn("读空闲超时 - 可能服务器未响应"); |
| | | break; |
| | | case WRITER_IDLE: |
| | | // 写空闲时主动发心跳 |
| | | HeartbeatCmd heartbeat = new HeartbeatCmd(timestamp); |
| | | ctx.writeAndFlush(heartbeat); |
| | | log.debug("写空闲 -> 发送心跳包 时间戳={}", timestamp); |
| | | try { |
| | | HeartbeatCmd heartbeat = new HeartbeatCmd(System.currentTimeMillis()); |
| | | ctx.writeAndFlush(heartbeat).addListener(future -> { |
| | | if (!future.isSuccess()) { |
| | | log.error("写心跳失败,网络断开,关闭连接"); |
| | | ctx.close(); |
| | | } |
| | | }); |
| | | } catch (Exception e) { |
| | | log.error("发送心跳异常", e); |
| | | ctx.close(); |
| | | } |
| | | break; |
| | | case ALL_IDLE: |
| | | log.debug("读写都空闲 - 可考虑关闭连接或重连"); |
| | | log.warn("读写都空闲 - 可考虑关闭连接或重连"); |
| | | break; |
| | | } |
| | | } else { |