2017-08-02 124 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层处理得很好。谢谢! –

相关问题