NodeJS:在实时事件上发布 AMQP 消息
NodeJS: Publish AMQP message on realtime event
我正在使用 amqplib 将消息发布到我的 RabbitMQ 服务器。这工作得很好,但我想我可以优化我做这件事的方式。
想法是监听串口以从中获取数据(连续发送)并将此数据发布到 AMQP 通道。然后订阅者获取两个需求的数据:
- 在网络前端显示实时值(socket.io)
- 将样本(每分钟)存储在 MySQL 数据库中(使用另一个节点或 PHP 代码)
这是我的代码:
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 returns 有时出错,然后整个应用程序死掉:
/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)
所以我正在寻找一种方法来制作一个强大的节点应用程序来执行这些任务。有什么想法吗?
谢谢
ch.close(function() { conn.close(); });
您要关闭频道,这导致了您看到的错误。
从您的应用中删除该行代码,它应该 运行 无限期地运行。
我正在使用 amqplib 将消息发布到我的 RabbitMQ 服务器。这工作得很好,但我想我可以优化我做这件事的方式。
想法是监听串口以从中获取数据(连续发送)并将此数据发布到 AMQP 通道。然后订阅者获取两个需求的数据:
- 在网络前端显示实时值(socket.io)
- 将样本(每分钟)存储在 MySQL 数据库中(使用另一个节点或 PHP 代码)
这是我的代码:
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 returns 有时出错,然后整个应用程序死掉:
/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)
所以我正在寻找一种方法来制作一个强大的节点应用程序来执行这些任务。有什么想法吗?
谢谢
ch.close(function() { conn.close(); });
您要关闭频道,这导致了您看到的错误。
从您的应用中删除该行代码,它应该 运行 无限期地运行。