ハートビート検出シナリオ:クラスタ内のノードとお互いの生存するかどうか、各ノード間の感覚。
- なぜハートビート?ネッティーそれを切断するコールバックメソッドを提供しませんか?
フライトモードまたは強制シャットダウンは、サーバーが認識してTCP長い接続がクローズされていない場合はアプリのシナリオでは、サーバーが接続が切断されているかどうかを検出するために、クライアントにハートビートパケットを送信する必要がある。この時間は携帯電話を開きます。
コーデックの多様を提供することに網状添加は、ハンドラはまた、アイドル状態のように、プロセッサを数多く提供していIdleStateHandler
サービス側の実装
/ ** * 2019年7月13日にfubinによって作成されます。 * / パブリック クラスBeartBeatServer { 公共 静的 ボイドメイン(文字列[]引数){ EventLoopGroup bossGroup = 新しいNioEventLoopGroup()。 EventLoopGroup workerGroup = 新しいNioEventLoopGroup(); 試す{ ServerBootstrap serverBootstrap = 新しいServerBootstrap(); serverBootstrap.group(bossGroup、workerGroup) .channel(NioServerSocketChannel。クラス) // 增加日志ハンドラ .handler(新しいLoggingHandler(LogLevel.INFO)) .childHandler(新しいHeartBeatInitializer()); ChannelFuture channelFuture = serverBootstrap.bind(8899 ).sync(); 。channelFuture.channel()closeFuture()同期()。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } 最後に{ bossGroup.shutdownGracefully()。 workerGroup.shutdownGracefully(); } } } クラス HeartBeatInitializerが延びていますChannelInitializer <たSocketChannel> { 保護 ボイド initChannel(のSocketChannelのSocketChannel)がスロー例外{ ChannelPipelineをChannelPipeline = socketChannel.pipeline(); // 網状はまた、そのようなアイドル・ハンドラの検出として、プロセッサのさまざまを提供 channelPipeline.addLast(新しい新しい IdleStateHandler( -5,7,10 、TimeUnit.SECONDS)); channelPipeline.addLast(新しい新しいHeartBeatHandler()); } } クラス HeartBeatHandler 延びChannelInboundHandlerAdapter { @Override 公共 ボイドuserEventTriggered(ChannelHandlerContext CTX、オブジェクトEVT)はスロー例外{ IdleStateEventイベント = (IdleStateEvent)EVTと、 文字列のeventType = nullを。 スイッチ(event.state()){ ケースREADER_IDLE: のeventType = "读空闲" 。 休憩; ケースWRITER_IDLE: のeventType = "写空闲" 。 休憩; ケースALL_IDLE: のeventType = "读写空闲" 。 休憩; } のSystem.out.println(ctx.channel()[リモート() + "超时事件:" + のeventType)。 。ctx.channel()に近いです(); } }
クライアントの実装
クライアントのクライアントコードは、チャットプログラムの使用に関するネッティーソケットサービスすることができ
ネッティーは、ハートビートコアハンドラの IdleStateHandler
説明のためのAPI
チャンネルは、読み取り、書き込みを行っていないか、またはその両方が実行されなかった場合は、IdleStateEventイベントをトリガします。
サポートされているアイドルidle
状態
プロパティ | 意味 |
---|---|
readerIdleTime | IdleState.READER_IDLEイベントのA IdleStateEvent状態を無効にするには0を指定し、読み出し動作が指定された期間内に行われないトリガします |
writerIdleTime | 書き込み操作をトリガーするIdleState.WRITE_IDLEイベントのIdleStateEventステータスが指定された期間内に実行されていない無効になっている、0を指定します |
allIdleTime | IdleState.ALL_IDLEイベントのA IdleStateEventステータスは0を指定し、時に指定された期間の読み取りおよび書き込み操作の実装が無効になっていませんトリガされます |
// スタックから流出することなく、30秒にpingメッセージを送信する例 // トラフィックのオフ押すとコネクタ60秒 クラス MyChannelInitializerを延びない ChannelInitializer <チャネル> { @Overrideが 保護 ボイドinitChannel(CHチャンネル){ ch.pipelineを() .addLast( "idleStateHandler"、新たな新 IdleStateHandler(60,30,0 )); ch.pipeline()addLast(。 "は、myHandler"、NULL ); } } クラス MyHandlerという延びChannelDuplexHandler { @Override 公共 ボイド userEventTriggered(ChannelHandlerContext CTX、オブジェクトEVT)スロー例外{ 場合(EVT のinstanceof IdleStateEvent){ IdleStateEvent E = (IdleStateEvent)EVT。 もし(e.state()== IdleState.READER_IDLE){ ctx.close()。 } それ以外の 場合(e.state()== IdleState.WRITER_IDLE){ ctx.writeAndFlush( "写空闲!" ); } } } } // サーバーのメイン ServerBootstrapブートストラップ= ...; bootstrap.childHandler(新しい MyChannelInitializer());