2

EasyNetQを使用して、RabbitMQに単純なクライアントを実装します。接続後、「キューのモデルシャットダウン」という通知が表示されます。これが私のコードです:

var _bus = RabbitHutch.CreateBus(String.Format("host={0}", hostName)).Advanced;
var _exchange = Exchange.DeclareFanout(exName);
var _queue = Queue.DeclareTransient();
_queue.BindTo(_exchange, "_");
_bus.Subscribe(
 _queue,
 (msg, properties, messageReceivedInfo) =>
 {
  return Task.Factory.StartNew(() =>
  {
   Console.WriteLine(msg.Length.ToString());
  });
 });

より低レベルのアプローチを使用すると、すべてがうまく機能します(メッセージの長さはコンソールに表示されます)。

var factory = new ConnectionFactory();
factory.HostName = hostName;
var connect = factory.CreateConnection();
var channel = connect.CreateModel();
channel.ExchangeDeclare(exName, "fanout");
var resultQueue = channel.QueueDeclare(string.Empty, false, true, false, null);
string queueName = resultQueue.QueueName;
var consumer = new QueueingBasicConsumer(channel);
channel.QueueBind(queueName, exName, string.Empty);
var resultConsume = channel.BasicConsume(queueName, false, consumer);
while(true)
{
 var e = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
 Console.WriteLine(e.Body.Length.ToString());
 channel.BasicAck(e.DeliveryTag, false);
}

最初のアプローチの何が問題になっていますか?

UPD IntelliTraceで例外をキャッチしました:

AMQP操作が中断されました:AMQPクローズ理由、ピアによって開始、code = 406、text = "PRECONDITION_FAILED-vhost'/'で交換'live'を異なるタイプ、耐久性、内部または自動削除値で再宣言できません"、classId = 40 、methodId = 10、cause =

Exchangeの設定は同じです(上記を参照)。では、何が問題なのですか?

4

2 に答える 2

3

Mike Hallow が言ったように、RabbitMQ 管理 Web インターフェイス経由でキューを作成したときに、既に設定したパラメーターを追加するまで、同じ問題がありました。

    var arguments = new Dictionary<string, object>( 2 );
    arguments.Add( "x-message-ttl", 900000 );
    arguments.Add( "x-dead-letter-exchange", "deadLetter" );
    this.requestMessageQueue = Queue.Declare( true, false, false, this.messageQueueConfiguration.RequestMessageQueueName, arguments );

RabbitMQ 管理 Web インターフェイスを介して設定されている既存のパラメーターを確認できます。


最近のコード変更以降、引数を直接設定する唯一の方法はManagement APIを使用することです。ただし、キューごとの ttl (x-message-ttl) または有効期限 (x-expires) のみを使用している場合はAdvanced APIを使用できます。 .

于 2013-03-22T11:04:31.227 に答える
2

サブスクライブを行った直後に _bus を破棄していますか? これにより、サブスクリプション チャネルが閉じられます。

于 2013-03-09T11:02:48.503 に答える