我在實(shí)際項(xiàng)目中碰到這樣一種情況:
在一個(gè)物聯(lián)網(wǎng)平臺(tái)中,目前僅接入了大約500臺(tái)設(shè)備,其中一半的設(shè)備設(shè)置了5分鐘強(qiáng)制斷線重連服務(wù)器功能,一半的設(shè)備設(shè)置為一旦鏈接服務(wù)器,保持在線功能。
程序邏輯如下
OnConnect 中,設(shè)備鏈接服務(wù)器的時(shí)候,設(shè)置定時(shí)器(定時(shí)器的作用是定時(shí)往這個(gè)設(shè)備發(fā)送一個(gè)指令并在OnMessage中接收返回?cái)?shù)據(jù))
同時(shí)在 onClose 中,關(guān)閉設(shè)置的定時(shí)器
然后在onWorkerStart 中設(shè)置了一個(gè)定時(shí)器,作用是每小時(shí)做一些數(shù)據(jù)庫(kù)的操作之類(lèi)的。
在正常的情況下,此程序運(yùn)行正常。
目前發(fā)生了一個(gè)狀況,因?yàn)槟承┰?,onWorkerStart 中的定時(shí)器在操作數(shù)據(jù)庫(kù)的時(shí)候,因?yàn)镾QL語(yǔ)句錯(cuò)誤的原因造成此定時(shí)器內(nèi)程序運(yùn)行錯(cuò)誤,并拋出異常。后果是 設(shè)置了5分鐘強(qiáng)制重連服務(wù)器的設(shè)備依然可以正常發(fā)送數(shù)據(jù)且接收返回,設(shè)置保持在線功能的設(shè)備從拋出異常開(kāi)始,設(shè)置的定時(shí)器再也不發(fā)送數(shù)據(jù),當(dāng)然也就沒(méi)有任何返回。
所以,猜測(cè),程序運(yùn)行邏輯:當(dāng)onWorkerStart 運(yùn)行錯(cuò)誤后,Gateway內(nèi)部有一個(gè)機(jī)制會(huì)強(qiáng)制將 OnConnect onClose onWorkerStart 等都運(yùn)行一遍。如果是這樣的話,那我這個(gè)項(xiàng)目當(dāng)中碰到的情況也就有了合理的解釋。
不知道如上理解是否正確?
另請(qǐng)教:對(duì)于echo類(lèi)的輸出可以用日志來(lái)保存,對(duì)于程序運(yùn)行異常是否也有日志記錄呢?或者說(shuō)是否有忽略錯(cuò)誤繼續(xù)運(yùn)行程序的方式(主要是某些考慮不周的原因?qū)е铝薙QL語(yǔ)句錯(cuò)誤進(jìn)而引發(fā)異常)
附加一點(diǎn)沒(méi)說(shuō)明白的,當(dāng)onWorkerStart運(yùn)行錯(cuò)誤后,程序會(huì)強(qiáng)制運(yùn)行onClose(但僅僅只是運(yùn)行了這個(gè)代碼,并沒(méi)有實(shí)際斷開(kāi)設(shè)備的鏈接),導(dǎo)致定時(shí)器刪除了,但是設(shè)備的鏈接還在。
businessWorker進(jìn)程退出會(huì)導(dǎo)致進(jìn)程內(nèi)所有的定時(shí)器都會(huì)銷(xiāo)毀。
所以之前OnConnect onClose onWorkerStart添加的定時(shí)器都會(huì)銷(xiāo)毀。
程序異常退出的日志會(huì)記錄在workerman.log中。
要忽略異常繼續(xù)執(zhí)行可以在可能發(fā)生異常的地方自行try catch異常。不過(guò)異常最好都記錄下來(lái),方便排錯(cuò),不然發(fā)生了異常導(dǎo)致業(yè)務(wù)異常,但是程序看不到報(bào)錯(cuò)很難定位。
生產(chǎn)環(huán)境上線的代碼都要經(jīng)過(guò)嚴(yán)格測(cè)試,最好不要有SQL語(yǔ)法錯(cuò)誤這種低級(jí)錯(cuò)誤。