不错不错,学习第四天 |
引用:jungle1992 发表于 2023-07-05 15:50 你要么直接去读MobileIMSDK的开源代码:https://github.com/JackJiang2011/MobileIMSDK ,它里面有完整的实现。 |
但一旦间隔许久没有收到服务端响应进行重连的逻辑应当写在哪里呢? 当收到服务端响应的 pong 消息时,就在当前 Channel 上记录一个时间,也就是说后续可以在定时任务中取出这个时间和当前时间的差额来判断是否超过阈值。 这部分代码 看的迷迷糊糊的 按照文章中的写法 没效果啊 |
感谢分享 |
感谢分享 |
thanks all |
谢谢分享 |
楼主造诣精深,佩服 |
赞 |
引用:JackJiang 发表于 2019-11-20 14:58 我原想说的是 1)接收到 channelInActive 事件的客户端,channelInActive 只会执行一次,但文中方案中 scheduledExecutorService.scheduleAtFixedRate(ReConnectJob,0,10,TimeUnit.SECONDS) 这个 job 会重复执行,也即“重连”,当重连成功后,会有一个新的客户端,而上述的 ReConnectJob 会【重复】执行。 ---- 经查看该项目代码,有对 channel != null && channel.isActive() 的判断,当满足条件时,会退出该函数。 ---- 客户端的 channelInActive 每执行一次,scheduledExecutorService 中会多一个 定时执行的 ReConnectJob, 2)即使在该代码中,当服务端多次断开时,客户端的 channelInActive 也会触发多次,也会有 多个 job 实例添加到 scheduledExecutorService 中定时执行。 |
引用:xchao263 发表于 2019-11-20 14:14 说了好大一段,一句话总结,你是想说啥? |
服务端挂掉或重启后,导致客户端需要“重连”问题,客户端 ChannelHandlerContext 客户的 IdleStateHandler 执行 channelInActive 是没问题的,因为服务端挂掉或关闭,对于此条客户端-服务端的链接就表示是“关闭”了,基于 netty 相关的技术链,相关的"事件"被触发。 此时执行重连,如果是能够连接上,此次的 ChannelHandlerContext 应该不是当前这个,而是一个新的, 示例代码中并没有看到 cimClient.reconnec() 连接成功明细及连接成功后的 channel 与当前这个 channel 的关联关联。 然后实际上 重连后的 channel 应该是一个全新的 channel,与当前这个并没有什么关系。 |
好,不错 |