node-amqp + rabbitMQ如何将post请求转换为消息

时间:2013-10-23 08:29:23

标签: node.js rabbitmq node-amqp

我有快速服务器设置来监听帖子请求并将帖子请求放入消息队列

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:guest@localhost: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个请求。

是否由于'connection.end'未关闭连接而发生?

我希望将每个帖子请求转换为RabbitMQ中的消息, 请告知是否有更好的方法。

(我在ubuntu 12.04上使用了带有rabbit-server-3.1.4-1的node-amqp的最新版本)

1 个答案:

答案 0 :(得分:0)

问题在于您为每个测试页面的发布请求创建了与队列的连接。因此,您必须在帖子处理程序之外创建此连接。

我没有测试过代码,但这应该可以解决问题:

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

var amqp = require('amqp');
var connection = amqp.createConnection({url: "amqp://guest:guest@localhost: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);