2016-02-25 39 views
0

我正在使用amqplib將消息發佈到我的RabbitMQ服務器。這工作得很好,但我認爲我可以優化我的工作方式。NodeJS:在實時事件中發佈AMQP消息

這個想法是聽一個串行端口從它獲取數據(這是連續發送),並將這些數據發佈到AMQP通道。然後,用戶可以得到的數據有兩個需求:

  • 顯示實時值(​​與socket.io)上的web前端
  • 商店的樣本(每分鐘)的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

ch.close(函數(){conn.close();});

您正在告訴渠道關閉,導致您看到的錯誤。

從你的應用程序中取出這行代碼,它應該無限期地運行。