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 }