HeartBeat心跳
心跳检测的必要性
1.集群心跳检测,避免网络中断
2.数据同步:主节点写日志,从节点每隔一段时间拉取主节点日志。
心跳检测存在的意义:
客户端和服务端已经建立了长连接,客户端开飞行模式,关机,关闭wifi,服务端不会(感知)收到通知(handRemoved)并关闭连接。
核心事件 :
ChannelInboundHandlerAdapter类的userEventTriggered事件
心跳检测服务端代码 :
server启动类 :
1 public class HeartBeatServer { 2 3 public static void main(String[] args) throws InterruptedException { 4 5 EventLoopGroup bossGroup = new NioEventLoopGroup(); 6 EventLoopGroup workerGroup = new NioEventLoopGroup(); 7 8 try{ 9 ServerBootstrap serverBootstrap = new ServerBootstrap(); 10 serverBootstrap.group(bossGroup,workerGroup). 11 channel(NioServerSocketChannel.class) 12 .handler(new LoggingHandler(LogLevel.INFO)) 13 .childHandler(new MyHeartBeatInitializer()); 14 15 ChannelFuture channelFuture = serverBootstrap.bind(8899).sync(); 16 channelFuture.channel().closeFuture().sync(); 17 }finally { 18 bossGroup.shutdownGracefully(); 19 workerGroup.shutdownGracefully(); 20 } 21 22 } 23 24 }
心跳检测初始化类 :
1 public class MyHeartBeatInitializer extends ChannelInitializer<SocketChannel> { 2 @Override 3 protected void initChannel(SocketChannel ch) throws Exception { 4 5 ChannelPipeline channelPipeline = ch.pipeline(); 6 7 channelPipeline.addLast(new IdleStateHandler(3,7,10, TimeUnit.SECONDS)); 8 channelPipeline.addLast(new MyHeartBeatHandler()); 9 10 } 11 }
心跳检测逻辑处理handler:
1 public class MyHeartBeatHandler extends ChannelInboundHandlerAdapter { 2 3 @Override 4 public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { 5 6 if(evt instanceof IdleStateEvent){ 7 IdleStateEvent idleStateEvent = (IdleStateEvent)evt; 8 9 String eventType = null; 10 11 switch (idleStateEvent.state()){ 12 case READER_IDLE: 13 eventType = "读空闲"; 14 break; 15 case WRITER_IDLE: 16 eventType = "写空闲"; 17 break; 18 case ALL_IDLE: 19 eventType = "读写空闲"; 20 break; 21 22 } 23 24 System.out.println(ctx.channel().remoteAddress()+" 超时事件:"+eventType); 25 26 ctx.channel().close(); 27 } 28 29 } 30 }
时间: 2024-10-10 04:21:01