4.3.4 处理心跳结果的示例


4.3.4 处理心跳结果的示例

如图4-34所示,客户端启动时会创建调度时间为0秒的延迟任务加入队列。客户端轮询的时间为2秒,会弹出延迟任务(因为延迟任务的调度时间小于当前时间),现在队列为空了。但是因为没有上一次心跳,只有上一次的会话重置时间,经过下面3个步骤的计算后,会重新创建一个调度时间为5秒的延迟任务加入队列。

(1)距离上次心跳的时间间隔=当前轮询的时间-上次会话的重置时间=2秒一0秒=2秒。
(2)距离下次心跳的时间间隔=心跳间隔距离上次心跳的时间间隔=5秒-2秒=3秒。
(3)下次心跳任务的时间=当前轮询的时间+距离下次心跳的时间间隔=2秒+3秒=5秒。

在这里插入图片描述

上面的步骤执行尾,队列中延迟任务的调度时间为5秒。在这之后,如果轮询时间小子5秒,则不会弹出队列的延迟任务,因为轮询的当前时间小于延迟任务的调度时间。如图4-35所示,只有当轮询时间为5秒时,才会弹州调度时间为5秒的延迟任务,现在队列又为空了。此时经过下面两个步骤计算出来的“距离下次心跳时间间隔”为0秒,就会执行发送心跳请求的逻辑。

(1)距离上次心跳的时间间隔=当前轮询的时间-上次会话的重置时间=5秒一0秒=5秒。
(2)距离下次心跳的时间间隔=心跳间隔一距离上次心跳的时间间隔=5秒-5秒=O秒。

在发送心跳请求之前,先记录上一次的心跳时间为当前时间即5秒。假设心跳在8秒时才完成(虚
线部分),经过下面3个步骤后,会重新创建调度时间为10秒的延迟任务放入队列中。

(1)距离上次心跳的时间间隔=心跳完成的时间一上次心跳的时间=8秒-5秒=3秒。
(2)距离下次心跳的时间间隔=心跳间隔-距离上次心跳的时间间隔=5秒-3秒=2秒。
(3)下次心跳任务的时间=心跳完成的时间+距离下次心跳的时间间隔=8秒+2秒=10秒。

在这里插入图片描述

延迟任务并不是一个线程,它必须通过客户端的轮询来触发执行。客户端刚启动时必须先创建一个延迟任务放入队列,这样客户端在轮询时,才有可能获取出延迟的任务去执行。如果客户端启动时没有创建延迟任务,那么队列中就永远不会有延迟任务。另外,轮询时如果弹出了需要执行的延迟任务,不管有没有执行发送心跳请求的流程,都要重新创建新的延迟任务放入队列。比如,图4-34没有执行发送心跳请求,也要创建调度时间为5秒的延迟任务。图4-34执行了发送心跳请求,在心跳响应处理后,创建调度时间为10秒的延迟任务。那么第一次创建延迟任务是在客户端启动后的什么时候发生呢?

相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页