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

2 つのメッセージを交換に公開してから 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の場合、サーバーがクライアントに代わってそれを実行します。

RabbitMQ1.8.1のバグを目​​撃しました。多分彼らはより厳しくなりました。

これは私のブランチ( http://github.com/spahl/node-amqp )で修正され、すべてのテストに合格しています。また、デフォルトの「amq.topic」交換を非永続として再宣言しようとするという事実も修正しました。

于 2010-07-25T04:56:43.227 に答える