Необработанная ошибка канала RabbitMQ / AMQP - NOT_FOUND

Я пытаюсь публиковать сообщения в RabbitMQ из скрипта Ruby (используя Bunny) и потреблять их из сервер 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

person tomtaylor    schedule 22.07.2010    source источник


Ответы (1)


Думаю, это ошибка в node-amqp. Код отправляет подтверждение по умолчанию, если для параметра options.ack установлено значение false.

Спецификации amqp 0.8 говорят, что сервер делает это от имени клиентов, когда noAck.

Я был свидетелем ошибки в RabbitMQ 1.8.1. Может, стали строже.

Это исправлено в моей ветке (http://github.com/spahl/node-amqp ) и все тесты проходят. Я также исправил тот факт, что он пытается повторно объявить обмен amq.topic по умолчанию как недолговечный.

person Seb    schedule 25.07.2010
comment
Идеально - это решает проблему для меня. Спасибо! - person tomtaylor; 26.07.2010