getty提供了心跳插件HeartBeatTimeOutHandler,可以监测并移除长时间没有心跳或数据读写的客户端连接,及时释放资源
IdleStateHandler
IdleStateHandler是心跳发起的开始,我把它称为起搏器。它有三个参数
一般而言,只需配置读消息间隔即可,写消息间隔建议配置为0,getty只提供读动作的监听插件。
写动作其实实际应用中比较少用到,除非你确实需要这么干,那么你需要自己实现这个插件
心跳插件的原理
如果间隔时间内,没有消息读取的连接,则loss_connect_time会累加一次,当loss_connect_time累加到3的时候,
也就是3次间隔时间内都没有消息读取,则框架会认为这个连接是不活跃的,则会移除这个连接。如果有消息读取,
那么loss_connect_time会重置为0,重新累计。
如果这个只累计一次就把连接移除,是不太合理的,累计3次再移除,在各种应用场景设计中是比较合理的。
public void userEventTriggered(AioChannel aioChannel, IdleState evt) {
if (evt == IdleState.READER_IDLE) {
loss_connect_time++;
if (loss_connect_time > 2) {
try {
logger.info("[closed inactive channel:" + aioChannel.getRemoteAddress().getHostString() + "]");
} catch (IOException e) {
e.printStackTrace();
aioChannel.close();
}
} else {
super.userEventTriggered(aioChannel, evt);
}