NodeJS:在实时事件

时间:2016-02-25 21:15:48

标签: node.js serial-port rabbitmq amqp

我使用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有时会返回错误,然后整个应用程序就会死掉:

/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)

因此,我正在寻找一种方法来使强大的节点应用程序执行这些任务。有什么想法吗?

由于

1 个答案:

答案 0 :(得分:1)

  

ch.close(function(){conn.close();});

你告诉频道要关闭,这会导致你看到的错误。

从您的应用中取出该行代码,它应无限期运行。