NodeJS:在实时事件上发布 AMQP 消息

NodeJS: Publish AMQP message on realtime event

我正在使用 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 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(); });

您要关闭频道,这导致了您看到的错误。

从您的应用中删除该行代码,它应该 运行 无限期地运行。