0

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

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

上面的代码假设收集发布请求并放入队列,如果我发送 10 个请求,队列中将有 300 多条消息。我不理解这种行为,或者可能是我对将 'publish' 调用放入 'ready' 函数的理解是错误的,因为上面代码中的 'connected' 日志消息对于 10 个 post 请求打印超过 10 个。

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

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

(我在 ubuntu 12.04 上使用最新的 node-amqp master 和 rabbit-server-3.1.4-1)

4

1 回答 1

2

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

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

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);
于 2013-10-23T10:53:05.437 回答