我在實際項目中碰到這樣一種情況:
在一個物聯(lián)網(wǎng)平臺中,目前僅接入了大約500臺設(shè)備,其中一半的設(shè)備設(shè)置了5分鐘強制斷線重連服務(wù)器功能,一半的設(shè)備設(shè)置為一旦鏈接服務(wù)器,保持在線功能。
程序邏輯如下
OnConnect 中,設(shè)備鏈接服務(wù)器的時候,設(shè)置定時器(定時器的作用是定時往這個設(shè)備發(fā)送一個指令并在OnMessage中接收返回數(shù)據(jù))
同時在 onClose 中,關(guān)閉設(shè)置的定時器
然后在onWorkerStart 中設(shè)置了一個定時器,作用是每小時做一些數(shù)據(jù)庫的操作之類的。
在正常的情況下,此程序運行正常。
目前發(fā)生了一個狀況,因為某些原因,onWorkerStart 中的定時器在操作數(shù)據(jù)庫的時候,因為SQL語句錯誤的原因造成此定時器內(nèi)程序運行錯誤,并拋出異常。后果是 設(shè)置了5分鐘強制重連服務(wù)器的設(shè)備依然可以正常發(fā)送數(shù)據(jù)且接收返回,設(shè)置保持在線功能的設(shè)備從拋出異常開始,設(shè)置的定時器再也不發(fā)送數(shù)據(jù),當(dāng)然也就沒有任何返回。
所以,猜測,程序運行邏輯:當(dāng)onWorkerStart 運行錯誤后,Gateway內(nèi)部有一個機制會強制將 OnConnect onClose onWorkerStart 等都運行一遍。如果是這樣的話,那我這個項目當(dāng)中碰到的情況也就有了合理的解釋。
不知道如上理解是否正確?
另請教:對于echo類的輸出可以用日志來保存,對于程序運行異常是否也有日志記錄呢?或者說是否有忽略錯誤繼續(xù)運行程序的方式(主要是某些考慮不周的原因?qū)е铝薙QL語句錯誤進而引發(fā)異常)
附加一點沒說明白的,當(dāng)onWorkerStart運行錯誤后,程序會強制運行onClose(但僅僅只是運行了這個代碼,并沒有實際斷開設(shè)備的鏈接),導(dǎo)致定時器刪除了,但是設(shè)備的鏈接還在。