Ошибка необработанного канала RabbitMQ / AMQP - NOT_FOUND - PullRequest
3 голосов
/ 22 июля 2010

Я пытаюсь опубликовать сообщения на 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

Если я опубликую два сообщения вexchange, а затем запустите сервер 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

1 Ответ

1 голос
/ 25 июля 2010

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

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

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

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

...