国产chinesehdxxxx野外,国产av无码专区亚洲av琪琪,播放男人添女人下边视频,成人国产精品一区二区免费看,chinese丰满人妻videos

Netty檢測空閑連接以及超時

2018-08-08 10:42 更新

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

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

Table 8.4 ChannelHandlers for idle connections and timeouts

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

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

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 調(diào)用 userEventTriggered ,如果連接沒有接收或發(fā)送數(shù)據(jù)超過60秒鐘
  2. 心跳發(fā)送到遠(yuǎn)端
  3. 發(fā)送的心跳并添加一個偵聽器,如果發(fā)送操作失敗將關(guān)閉連接
  4. 事件不是一個 IdleStateEvent 的話,就將它傳遞給下一個處理程序

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


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號