Отключение модели EasyNetQ

Я реализую простой клиент для RabbitMQ, используя EasyNetQ. После подключения я получаю уведомление "Модель выключения для очереди". Вот мой код:

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, инициированная Peer, code=406, text="PRECONDITION_FAILED - невозможно повторно объявить обмен 'live' в vhost '/' с другим типом, долговременным, внутренним значением или значением автоматического удаления", classId=40, methodId=10, причина =

Настройки обмена такие же (см. Выше). Так что не так?

2 ответа

Решение

У меня была та же проблема, пока я не добавил параметры, которые я уже настроил, когда создавал очередь через веб-интерфейс управления RabbitMQ, как сказал Майк Хэллоу.

    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.


После недавнего изменения кода единственный способ установить аргументы напрямую - через API управления, если только вы не используете только для каждой очереди ttl (x-message-ttl) или expires (x-expires), и в этом случае вы можете использовать Advanced API,

Вы выбрасываете _bus вскоре после подписки? Это закрыло бы канал подписки.

Другие вопросы по тегам