W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
為了能夠及時的將資源釋放出來,我們會檢測空閑連接和超時。常見的方法是通過發(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(…) 方法檢測到。 |
WriteTimeoutHandler | WriteTimeoutException 可以通過覆蓋 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
}
}
}
}
總而言之,這個例子說明了如何使用 IdleStateHandler 測試遠端是否還活著,如果遠端已經不活著了就可以將該鏈接關閉以釋放資源。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: