一般的心跳檢測機制都是定時向服務端請求或服務端定時向客戶端發送數據以確認連接是否存活。
這種情況一般存在兩個問題:
一、請求會佔用通道的資源,如果判斷連接是否屬於空閒;
二、定時任務維護成本;
Netty提供了IdleStateHandler 來進行心跳檢測。
通過使用ch.pipeline().addLast(new IdleStateHandler(0,0,5, TimeUnit.SECONDS))
將心跳檢測加入到pipeline中netty會在設定的延遲時間內主動發起IdleStateEvent事件,可以在任意一個handler中來處理這個事件
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if(evt instanceof IdleStateEvent){
...
}
super.userEventTriggered(ctx, evt);
}
IdleStateHandler構造方法有4個參數
int readerIdleTimeSeconds //讀超時時間
int writerIdleTimeSeconds //寫超時時間
int allIdleTimeSecond //所有事件超時時間
TimeUnit unit //超時時間單位