2017-08-02 160 views
0

我正在使用寫在Node.js中的服務通過MQTT(https://www.npmjs.com/package/mqtt)接收消息,然後寫入數據庫(使用mssql的SQL Server)。如何使用MQTT處理Node.js中的消息處理失敗?

當一切正常工作時,這將工作得非常好,我創建了mqtt偵聽器並訂閱了新的消息事件。

但是,如果與數據庫的連接失敗(這可能會由於網絡中斷等原因而週期性發生),那麼將消息寫入數據庫將失敗,並且該消息將被丟棄。

我想告訴MQTT經紀人 - 「我無法處理該消息,直到我可以將其保存在緩衝區中。」

var mqtt = require('mqtt') 
var client = mqtt.connect('mymqttbroker') 

client.on('connect', function() { 
    client.subscribe('messagequeue') 
}) 

client.on('message', function (topic, message) { 
    writeMessageToDB(message).then((result) => {console.log('success'};).catch((err) => {/* What can I do here ?*/}); 
}) 

回答

2

也許在重發功能上設置超時?可能應該改進爲在嘗試刪除郵件之前只嘗試n次,但這絕對是的一種方式來做到這一點。這顯然沒有經過測試,但它應該有希望給你一些想法...

var resend = function(message){ 

    writeMessageToDB(message).then((result) => { 

     console.log('Resend success!') 

    }) 
    .catch((err) => { 

     setTimeout(function(message){ 
      resend(message); 
     }, 60000); 

    }); 
} 

client.on('message', function (topic, message) { 

    writeMessageToDB(message).then((result) => { 

     console.log('success') 

    }) 
    .catch((err) => { 

     resend(message); 

    }); 
}); 
+0

這是一個非常有用的方法,它可能是前進的方向! –

+1

@TerryLennox只需要注意,如果命令或併發很重要,那麼這種方法會導致問題... –

+0

在這種情況下,命令並不重要,消息可能會按順序到達DB層處理得很好。謝謝! –