2013-10-23 65 views
0

我有明確的服務器設置,聽取職務的請求,並把在消息隊列發佈請求節點AMQP +的RabbitMQ如何POST請求轉換成消息

var express = require('express'); 
var app = express(); 
app.use(express.bodyParser()); 

app.post('/test-page', function(req, res) { 
    var amqp = require('amqp'); 
    var connection = amqp.createConnection({url: "amqp://guest:[email protected]:5672"},{defaultExchangeName: ''}); 
    connection.on('ready',function(){ 
     console.log('connected'); 
     var messageToSend = req.body; 
     var queueToSendTo = "xyz"; 
     connection.queue(queueToSendTo,{'passive': true},function(){ 
     connection.publish(queueToSendTo, messageToSend); 
     res.send(200); 
     connection.end(); 
     }); 

    }); 

}); 

app.setMaxListeners(0); 
app.listen(80); 

上面的代碼是假設收集POST請求和放在隊列中,如果我發送了10個請求,隊列中會有300多條消息。我不理解這種行爲,或者可能是因爲上面的代碼中的「連接」日誌消息在10個發佈請求中打印超過10個,因此我認爲將'發佈'調用放在'就緒'功能中是錯誤的。

是否因'connection.end'未關閉連接而發生?

我希望將每個帖子請求轉換爲RabbitMQ中的消息, 請告知是否有更好的方法。

(我用的節點AMQP的最新主兔服務器-3.1.4-1在Ubuntu 12.04)

回答

0

的問題是,你正在爲每一個崗位的要求來測試到隊列的連接-頁。所以你必須在帖子處理器之外創建這個連接。

我沒有測試的代碼,但這個應該做的伎倆:

var express = require('express'); 
var app = express(); 
app.use(express.bodyParser()); 

var amqp = require('amqp'); 
var connection = amqp.createConnection({url: "amqp://guest:[email protected]:5672"},{defaultExchangeName: ''}); 
connection.on('ready', function() { 
    console.log('connected'); 
}); 

app.post('/test-page', function(req, res) {  
    var messageToSend = req.body; 
    var queueToSendTo = "xyz"; 
    connection.publish(queueToSendTo, messageToSend); 
    res.send(200); 
}); 

app.setMaxListeners(0); 
app.listen(80); 
+1

該訣竅。完美工作。謝謝。然而,由於默認的'reconnect:true'值,連接沒有結束。對於那些堅持每次創建新連接的用戶,都應該使用'connection.implOptions.reconnect = false'這一行。將解決原來的問題。雖然最好的辦法是接受答案。 – sachinkale

相關問題