关于程序代码中出现异常后的程序运行逻辑请教

huboy

我在实际项目中碰到这样一种情况:

在一个物联网平台中,目前仅接入了大约500台设备,其中一半的设备设置了5分钟强制断线重连服务器功能,一半的设备设置为一旦链接服务器,保持在线功能。

程序逻辑如下

OnConnect 中,设备链接服务器的时候,设置定时器(定时器的作用是定时往这个设备发送一个指令并在OnMessage中接收返回数据)

同时在 onClose 中,关闭设置的定时器

然后在onWorkerStart 中设置了一个定时器,作用是每小时做一些数据库的操作之类的。

在正常的情况下,此程序运行正常。

目前发生了一个状况,因为某些原因,onWorkerStart 中的定时器在操作数据库的时候,因为SQL语句错误的原因造成此定时器内程序运行错误,并抛出异常。后果是 设置了5分钟强制重连服务器的设备依然可以正常发送数据且接收返回,设置保持在线功能的设备从抛出异常开始,设置的定时器再也不发送数据,当然也就没有任何返回。

所以,猜测,程序运行逻辑:当onWorkerStart 运行错误后,Gateway内部有一个机制会强制将 OnConnect onClose onWorkerStart 等都运行一遍。如果是这样的话,那我这个项目当中碰到的情况也就有了合理的解释。

不知道如上理解是否正确?

另请教:对于echo类的输出可以用日志来保存,对于程序运行异常是否也有日志记录呢?或者说是否有忽略错误继续运行程序的方式(主要是某些考虑不周的原因导致了SQL语句错误进而引发异常)

3093 3 0
3个回答

huboy

附加一点没说明白的,当onWorkerStart运行错误后,程序会强制运行onClose(但仅仅只是运行了这个代码,并没有实际断开设备的链接),导致定时器删除了,但是设备的链接还在。

  • 暂无评论
walkor 打赏

businessWorker进程退出会导致进程内所有的定时器都会销毁。
所以之前OnConnect onClose onWorkerStart添加的定时器都会销毁。

程序异常退出的日志会记录在workerman.log中。

要忽略异常继续执行可以在可能发生异常的地方自行try catch异常。不过异常最好都记录下来,方便排错,不然发生了异常导致业务异常,但是程序看不到报错很难定位。

生产环境上线的代码都要经过严格测试,最好不要有SQL语法错误这种低级错误。

  • 暂无评论
huboy

非常感谢!了解了!

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