我使用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捕获了Exception:
AMQP操作被中断:AMQP关闭原因,由...发起 同行,代码= 406,text =“PRECONDITION_FAILED - 无法重新声明交换 'live'in vhost'/'具有不同的类型,耐用,内部或 autodelete value“,classId = 40,methodId = 10,cause =
交换设置是相同的(见上文)。那有什么不对?
答案 0 :(得分:3)
我遇到了同样的问题,直到我添加了通过RabbitMQ Management web interface创建队列时已经设置的参数,Mike Hallow said。
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界面设置的现有参数。
自recent code change以来,直接设置参数的唯一方法是通过Management API,除非你只使用每个队列ttl(x-message-ttl)或expires(x-expires)在哪种情况下,您可以使用Advanced API。
答案 1 :(得分:2)
您在订阅后是否很快处理了_bus?这将关闭订阅频道。