1. 程式人生 > >netty的心跳檢測實現

netty的心跳檢測實現

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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);     }

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述