如何使用MQTT处理Node.js中的消息处理失败?

时间:2017-08-02 07:27:35

标签: node.js mqtt

我使用Node.js编写的服务通过MQTT(https://www.npmjs.com/package/mqtt)接收消息,然后写入数据库(使用mssql的SQL Server)。

当一切正常运行时,这将非常好用,我创建mqtt监听器并订阅新的消息事件。

但是,如果与DB的连接失败(这可能由于网络中断等而定期发生),则将消息写入数据库将失败,并且消息将被丢弃。

我想告诉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 ?*/});
})

1 个答案:

答案 0 :(得分: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);

    });
});