5.2 失败重连
在网络情况差的情况下,客户端第一次连接可能会连接失败,这个时候我们可能会尝试重连。重连的逻辑写在连接失败的逻辑块里。
在重连的时候,依然调用同样的逻辑。因此,我们把建立连接的逻辑先抽取出来,然后在重连的时候,递归调用自身。
上面这一段便是带有自动重连功能的逻辑,可以看到在连接失败的时候,会调用自身进行重连。
但是,在通常情况下,连接失败不会立即重连,而是通过一个指数退避的方式,比如每隔1秒、2秒、4秒、8秒,以2的幂次来建立连接,到达一定次数之后就放弃连接。接下来我们实现这段逻辑,默认重试5次。
从上面的代码可以看到,通过判断连接是否成功及剩余的重试次数,分别执行不同的逻辑。
1.如果连接成功,则打印连接成功的消息。
2.如果连接失败但重试次数已经用完,则放弃连接。
3.如果连接失败但重试次数仍然没有用完,则计算下一次重连间隔delay,然后定期重连。
在上面的代码中,我们看到,定时任务调用的是bootstrap.config().group().schedule(),其中bootstrap.config()这个方法返回的是BootstrapConfig,它是对Bootstrap配置参数的抽象,然后bootstrap.config().group()返回的就是我们在一开始配置的线程模型workerGroup,调用workerGroup的schedule方法即可实现定时任务逻辑。
在schedule方法块里,前四个参数原封不动地传递,最后一个重试次数参数减掉1,就是下一次建立连接时的上下文信息。读者可以自行修改代码,更改到一个连接不上的服务端Host或者Port,查看控制台日志就可以看到5次重连日志。
以上就是实现指数退避的客户端重连逻辑。接下来,我们一起学习一下,客户端启动过程中的引导类Bootstrap除了指定线程模型、IO模型、连接读写处理逻辑,还可以做哪些事情?