GatewayWorker 中Timer问题

xxj

我建立了4个worker进程,在设备连接后,会开启一个20秒的任务。因为设备信号的问题,有时设备会断开后又重连,这时候会与服务器建立新的连接。在新的连接中,我会判断设备是否时这种断了又连的情况,如果是这种情况我会用Gateway::closeClient($old_client_id);
关闭老连接,在onclose 事件中 去删除 在老连接开启的20秒任务。现在又两问题:
1:有时20秒任务 突然不运行了。这个时根据设备端发送的心跳信息判断的,正常在20秒任务中,我会与设备通讯一次。因此设备是不会发送心跳信号的,如果60秒设备与服务器之前没有通讯就会发送心跳。因此服务端接收到心跳时,我只有重新开始一个20秒任务,来解决这个Timer失效的问题;
2:在onclose 删除定时器时,有时候觉得好像没有删除掉,因为对于的逻辑还在运行,还在向数据库写数据。是否时因为开启了多个进程的原因,执行删除定时器所在进程和创建定时器所在进程不一致,因此通过Timer.del(?),这个?对于的定时器不存在呢?
3:我如何知道到底当前不同的worker进程中有哪些定时器任务在执行呢?
请指点下,谢谢!

1902 2 0
2个回答

six

利用心跳可以关闭老的无用连接。
设置

$gateway->pingInterval = 55;
$gateway->pingNotResponseLimit = 1;

这样55秒内没有发心跳的设备的连接会自动close,不用手动调用closeClient()

  • xxj 2021-03-09

    这个知道了,谢谢。主要还Timer定时任务为什么不执行了。

  • six 2021-03-09

    有可能你认为没在执行,实际上在执行,定时函数里第一行打日志看下

不败少龙

还是要用workerman的定时器方法去执行

  • 暂无评论
年代过于久远,无法发表回答
🔝