我使用amqplib将消息发布到我的RabbitMQ服务器。这工作得很好,但我认为我可以优化我的方式。
我们的想法是收听串口以获取数据(连续发送)并将此数据发布到AMQP通道。然后订阅者获得有两个需求的数据:
这是我的代码:
function on_connect(err, conn) {
if (err !== null) return bail(err);
function on_channel_open(err, ch) {
if (err !== null) return bail(err, conn);
ch.assertQueue(amqp_channel, {durable: false}, function(err, ok) {
if (err !== null) return bail(err, conn);
var trameEvents = teleinfo('/dev/ttyAMA0');
trameEvents.on('tramedecodee', function (data) {
ch.sendToQueue(amqp_channel, new Buffer(data));
console.log("Sent '%s'", data);
});
//log errors
trameEvents.on('error', function (err) {
console.log(util.inspect(err));
});
ch.close(function() { conn.close(); });
});
}
conn.createChannel(on_channel_open);
}
问题是trameEvents有时会返回错误,然后整个应用程序就会死掉:
/home/pi/nodejs/teleinfo-amqp-publisher/node_modules/amqplib/lib/channel.js:149
throw new IllegalOperationError(msg, stack);
^
IllegalOperationError: Channel closed
at Channel.<anonymous> (/home/pi/nodejs/teleinfo-amqp-publisher/node_modules/amqplib/lib/channel.js:149:11)
因此,我正在寻找一种方法来使强大的节点应用程序执行这些任务。有什么想法吗?
由于
答案 0 :(得分:1)
ch.close(function(){conn.close();});
你告诉频道要关闭,这会导致你看到的错误。
从您的应用中取出该行代码,它应无限期运行。