netty的心跳檢測實現
阿新 • • 發佈:2018-11-08
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
由於netty採用了事件機制,因此給鏈路監測和連線管理帶來了一些麻煩,因此最好給鏈路加上心跳處理(1) 伺服器端關鍵點,主要在initpipe中和實現IdleStateAwareChannelHandler. pipeline.addLast("timeout" , new IdleStateHandler(timer, 10, 10, 0));//此兩項為新增心跳機制 10秒檢視一次線上的客戶端channel是否空閒,IdleStateHandler為netty jar包中提供的類 pipeline.addLast("hearbeat", new Heartbeat());如果要捕獲檢測結果,需要繼承IdleStateAwareChannelHandler,來判斷客戶端是否存在,但是這種機制還得一個心跳包傳送來檢測。public class Heartbeat extends IdleStateAwareChannelHandler{ int i = 0; @Override public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e) throws Exception { // TODO Auto-generated method stub super.channelIdle(ctx, e); if(e.getState() == IdleState.WRITER_IDLE) i++; if (i==3){ e.getChannel().close(); System.out.println("掉了。"); } } }(2)客戶端關鍵點,也在booststrap,initpipe和IdleStateAwareChannelHandler bootstrap.setOption("allIdleTime","5"); //這裡,很重要 pipeline.addLast("timeout", new IdleStateHandler(timer, 0, 0, 10)); pipeline.addLast("idleHandler", new ClientIdleHandler()); 實現IdleStateAwareChannelHandler 的handler負責定時傳送檢測包public class ClientIdleHandler extends IdleStateAwareChannelHandler { final Logger logger = LoggerFactory.getLogger(ClientIdleHandler.class); @Override public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e) throws Exception { if( e.getState() == IdleState.ALL_IDLE){ logger.debug("鏈路空閒!傳送心跳!S:{} - C:{} idleState:{}", new Object[]{ctx.getChannel().getRemoteAddress(), ctx.getChannel().getLocalAddress() , e.getState()}); e.getChannel().write(MessageHelper.buildMessageEcho()); super.channelIdle(ctx, e); } }}此外為了獲得一些業務阻塞異常導致一些網路不確認狀態,採取辦法是:用傳送upstream的異常來通知解決。 public void exceptionCaught( ChannelHandlerContext ctx, ExceptionEvent e) throws Exception { if (this == ctx.getPipeline().getLast()) { logger.warn( "EXCEPTION, please implement " + getClass().getName() + ".exceptionCaught() for proper handling.", e.getCause()); } ctx.sendUpstream(e); }