2014-03-13 107 views
2

我的方案:我希望我的應用程序將日誌發佈到RabbitMQ,並讓另一個進程使用這些日誌並寫入數據庫。另外,即使目前沒有消費者,日誌也應該保留在RabbitMQ中。但是,通過我現在的代碼,我的日誌不會顯示在RabbitMQ中,除非我啓動了一個消費者。我究竟做錯了什麼?當沒有消費者時,獲取消息以堅持RabbitMQ

我的代碼:

var amqp = require('amqp'); 
var connection = amqp.createConnection({ 
    host: "localhost", 
    port: 5672 
}); 

connection.on('ready', function() { 
    // Immediately publish 
    setTimeout(function() { 
     connection.publish('logs', 
      new Buffer('hello world'), {}, 
      function(err, res) { 
       console.log(err, '|', res); 
      }); 
    }, 0); 

    // Wait a second to subscribe 
    setTimeout(function() { 
     connection.queue('logs', function(q) { 
      q.subscribe(function(message) { 
       console.log(message.data); 
      }); 
     }); 
    }, 1000); 
}); 

回答

4

很多時候,一般的設置與兔MQ是爲發佈聲明和交流,併發布到它。然後消費者聲明相同的交易所(如果消費者已經在那裏並且如果消費者首先開始創建它,它將確保它存在)。這對您的使用不正確。您需要從開始發佈到創建隊列時創建隊列。

出版商必須建立交流和隊列,隊列必須

自動刪除=假

,耐用只有當你打算重新啓動服務器的RabbitMQ幫助。然後發佈到交易所,郵件將被傳送到隊列中,等待消費者連接到消息隊列,然後讀取所有錯過的消息。它必須使用與生產者在聲明隊列時完全相同的隊列聲明參數。由於這是

自動刪除=假

這將確保無論當消費者自帶上下會活着並保留郵件。

+0

經過測試和工作!有一點超出範圍,但是如果我用Queue聲明包裝我的發佈,這是否會導致另一次往返RabbitMQ,或者我的庫(amqp for nodejs)是否足夠聰明,可以在給定會話中緩存已創建的隊列? –

+1

如果您使用的是固定隊列名稱,則只需創建一次即可。如果它完全是靜態的,你甚至可以手動在代碼外部創建它。如果你嘗試創建一個已經存在的隊列,它將會確認它的存在。 – robthewolf

相關問題