根據(jù)官方示例
在 onWorkerStart的回調(diào)中進(jìn)行創(chuàng)建mqtt客戶端,然后進(jìn)行訂閱
但官方是訂閱一個topic
我現(xiàn)在的需求是以數(shù)組的方式進(jìn)行多個topic訂閱,
數(shù)組來源于數(shù)據(jù)庫,
發(fā)現(xiàn)命令行運(yùn)行之后,數(shù)據(jù)庫訂閱信息進(jìn)行更新但是workerman創(chuàng)建的mqtt客戶端里面訂閱的仍然是之前的數(shù)據(jù),
目前解決的辦法是手動reload命令行,
請問官方人員和其他有經(jīng)驗的大佬,這個問題如何在不重啟命令行的情況下進(jìn)行處理。
也嘗試過如下代碼,但不知合不合理。希望官方給予回復(fù)。
如上,測試每10秒進(jìn)行訂閱,訂閱信息確實能夠及時更新了,但是沒有測試其他功能是否正常,希望官方給予最佳實踐,感謝!
剛才測了上述方法,訂閱是能更新了,但是onMessage回調(diào)沒有執(zhí)行,一直在執(zhí)行上面的循環(huán)。
只要你看過workerman開發(fā)必讀就不會問這種問題
7、不要使用exit die sleep語句
業(yè)務(wù)執(zhí)行exit die語句會導(dǎo)致進(jìn)程退出,并顯示W(wǎng)ORKER EXIT UNEXPECTED錯誤。當(dāng)然,進(jìn)程退出了會立刻重啟一個新的進(jìn)程繼續(xù)服務(wù)。如果需要返回,可以調(diào)用return。sleep語句會讓進(jìn)程睡眠,睡眠過程中不會執(zhí)行任何業(yè)務(wù),框架也會停止運(yùn)行,會導(dǎo)致該進(jìn)程的所有客戶端請求都無法處理。
9、業(yè)務(wù)代碼里不要有死循環(huán)
業(yè)務(wù)代碼里不要有死循環(huán),否則會導(dǎo)致控制權(quán)無法交還給workerman框架,導(dǎo)致無法接收處理其它客戶端消息。
感覺這個邏輯有問題,onConnent是連接回調(diào),不應(yīng)該在這里面訂閱。訂閱是阻塞任務(wù)。
我認(rèn)為應(yīng)該是另起一個進(jìn)程訂閱,收到數(shù)據(jù)后通知已連接的客戶端??蛻舳诉B接成功后可以把需要通知的客戶端ID放到redis,然后保持在線就可以。訂閱進(jìn)程拿到數(shù)據(jù)后查redis看需要給哪個客戶端推送。
個人理解,不一定對,僅限參考
也考慮過使用 Timer 一段時間后執(zhí)行命令行重啟
但這樣涉及到liunx用戶權(quán)限以及操作處理是否成功或者異常等問題,沒有深入研究過,測試在Worker的onWorkerReload回調(diào)成功執(zhí)行,但依然覺得并不是最佳實踐。