99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Netty檢測空閑連接以及超時

2018-08-08 10:42 更新

為了能夠及時的將資源釋放出來,我們會檢測空閑連接和超時。常見的方法是通過發(fā)送信息來測試一個不活躍的鏈接,通常被稱為“心跳”,然后在遠端確認它是否還活著。(還有一個方法是比較激進的,簡單地斷開那些指定的時間間隔的不活躍的鏈接)。

處理空閑連接是一項常見的任務,Netty 提供了幾個 ChannelHandler 實現(xiàn)此目的。表8.4概述。

Table 8.4 ChannelHandlers for idle connections and timeouts

名稱描述
IdleStateHandler如果連接閑置時間過長,則會觸發(fā) IdleStateEvent 事件。在 ChannelInboundHandler 中可以覆蓋 userEventTriggered(...) 方法來處理 IdleStateEvent。
ReadTimeoutHandler在指定的時間間隔內沒有接收到入站數(shù)據(jù)則會拋出 ReadTimeoutException 并關閉 Channel。ReadTimeoutException 可以通過覆蓋 ChannelHandler 的 exceptionCaught(…) 方法檢測到。
WriteTimeoutHandlerWriteTimeoutException 可以通過覆蓋 ChannelHandler 的 exceptionCaught(…) 方法檢測到。

詳細看下 IdleStateHandler,下面是一個例子,當超過60秒沒有數(shù)據(jù)收到時,就會得到通知,此時就發(fā)送心跳到遠端,如果沒有回應,連接就關閉。

Listing 8.7 Sending heartbeats

public class IdleStateHandlerInitializer extends ChannelInitializer<Channel> {

    @Override
    protected void initChannel(Channel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        pipeline.addLast(new IdleStateHandler(0, 0, 60, TimeUnit.SECONDS));  //1
        pipeline.addLast(new HeartbeatHandler());
    }

    public static final class HeartbeatHandler extends ChannelInboundHandlerAdapter {
        private static final ByteBuf HEARTBEAT_SEQUENCE = Unpooled.unreleasableBuffer(
                Unpooled.copiedBuffer("HEARTBEAT", CharsetUtil.ISO_8859_1));  //2

        @Override
        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
            if (evt instanceof IdleStateEvent) {
                 ctx.writeAndFlush(HEARTBEAT_SEQUENCE.duplicate())
                         .addListener(ChannelFutureListener.CLOSE_ON_FAILURE);  //3
            } else {
                super.userEventTriggered(ctx, evt);  //4
            }
        }
    }
}
  1. IdleStateHandler 將通過 IdleStateEvent 調用 userEventTriggered ,如果連接沒有接收或發(fā)送數(shù)據(jù)超過60秒鐘
  2. 心跳發(fā)送到遠端
  3. 發(fā)送的心跳并添加一個偵聽器,如果發(fā)送操作失敗將關閉連接
  4. 事件不是一個 IdleStateEvent 的話,就將它傳遞給下一個處理程序

總而言之,這個例子說明了如何使用 IdleStateHandler 測試遠端是否還活著,如果遠端已經不活著了就可以將該鏈接關閉以釋放資源。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號