3

我正在尝试从 Ruby 脚本(使用Bunny )向 RabbitMQ 发布消息,并从 node.js 服务器(使用node-amqp)使用它们。

第一条消息成功到达,但随后在 node.js 中记录了一个错误,连接关闭,没有收到更多消息:

mu:charlie-node tom$ node charlie.js 
22 Jul 09:11:04 - Running in development environment.
22 Jul 09:11:04 - Connected to AMQP.
22 Jul 09:11:04 - {"build_id":1234}
Unhandled channel error: NOT_FOUND - unknown delivery tag 1

如果我将两条消息发布到交换中,然后运行 ​​node.js 服务器,我可以看到它们都在记录错误之前到达,这表明 RabbitMQ 在交换或队列为空时正在关闭它。但是,由于我在这两个上都将 autoDelete 设置为 false,所以它不应该。

有什么建议么?

我的 node.js 脚本看起来像这样:

var amqpConnection = amqp.createConnection({ host: config.rabbitmq.host });

amqpConnection.addListener('ready', function() {
  sys.log("Connected to AMQP.");

  var exchange = amqpConnection.exchange('job_exchange', {
    type : 'topic',
    passive : false,
    durable : true, 
    autoDelete : false
  })

  exchange.addListener('open', function() {

    var queue = amqpConnection.queue('arthr_queue', {
      passive : false,
      autoDelete : false,
      durable : true,
      exclusive : false
    });

    queue.bind(exchange, '#');

    queue.subscribe(function(message) {
      sys.log(message.data.toString());
    });
  });
});

我的 Ruby 脚本看起来像:

require 'rubygems'
require 'bunny'
require 'json'

b = Bunny.new(:logging => true)

b.start

job_exchange = b.exchange('job_exchange', 
  :type => :topic, 
  :durable => true, 
  :auto_delete => false, 
  :passive => false
)

message = {
  :build_id => 1234
}

job_exchange.publish(message.to_json, :key => 'arthr.rebuild')

b.stop
4

1 回答 1

1

我认为这是 node-amqp 中的一个错误。当 options.ack 设置为 false 时,代码默认发送一个 ack。

amqp 0.8 规范说,当 noAck 时,服务器代表客户端执行此操作。

我目睹了 RabbitMQ 1.8.1 的错误。也许他们变得更严格了。

它已在我的分支 ( http://github.com/spahl/node-amqp ) 中修复,并且所有测试都通过了。我还修复了它试图将默认的“amq.topic”交换重新声明为非持久的事实。

于 2010-07-25T04:56:43.227 回答