EasyNetQ模型关闭

我使用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操作被中断:由Peer发起的AMQP关闭原因,code = 406,text =“PRECONDITION_FAILED - 不能在具有不同类型,持久,内部或自动删除值的虚拟主机'/'中重新声明交换'实时'”,classId = 40 ,methodId = 10,cause =

Exchange设置相同(请参阅上文)。 那么,怎么了?


正如Mike Hallow说的那样,直到我添加了我通过RabbitMQ Management 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)或expires(x-expires),在这种情况下,您可以使用Advanced API 。


您是否在订阅后立即处理您的_bus? 这将关闭订阅频道。

链接地址: http://www.djcxy.com/p/34205.html

上一篇: EasyNetQ model shutdown

下一篇: RabbitMQ: persistent message with Topic exchange