.NEt核心出现Rabbit MQ异常

relj7zay  于 2022-12-01  发布在  .NET
关注(0)|答案(2)|浏览(146)

以下是我收到的例外.Net核心和rabbitMQ:AMQP操作被中断:AMQP关闭原因,由对等端启动,code=405,text ='RESOURCE_LOCKED -无法独占访问vhost '/'中的锁定队列'demo-queue'。它最初可能在另一个连接上声明,或者exclusive属性值与原始声明的属性值不匹配。',classId=50,methodId=10

制作人:

var factory = new ConnectionFactory
        {

            Uri = new Uri("amqp://guest:guest@localhost:5672")

        };

        using var connection= factory.CreateConnection();   
        using var channel=  connection.CreateModel();
        channel.QueueDeclare("demo-queue",durable:true,exclusive:true,autoDelete:false, arguments:null);
        var message = new
        {
            Name = "Producer",
            Message = "Hello!"
        };
        var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message));

        channel.BasicPublish("", "demo-queue",null,body);

消费者:

var factory = new ConnectionFactory
        {

            Uri = new Uri("amqp://guest:guest@localhost:5672")

        };

        using var connection = factory.CreateConnection();
        using var channel = connection.CreateModel();
        channel.QueueDeclare("demo-queue", durable: true,
            exclusive: true, autoDelete: false,
            arguments: null);
        var consumer = new EventingBasicConsumer(channel);
        consumer.Received += (sender, e) =>
         {
             var body = e.Body.ToArray();
             var message = Encoding.UTF8.GetString(body);
             Console.WriteLine(message);
         };

        channel.BasicConsume("demo-queue",true,consumer);

如果我更改在生产者或消费者中给出的队列名称,这是正确的做法还是正确的方式?哪种方式是正确的处理方式?

6pp0gazn

6pp0gazn1#

QueueDeclare部分中,您提到了与您创建的队列不同的属性。

编辑:

你所有的错误都在这行代码中。因为你创建了一个队列。现在你想用错误的属性打开它。我认为exclusive: false会解决这个问题

//channel.QueueDeclare("demo-queue",durable:true,exclusive:true,autoDelete:false, arguments:null);

  channel.QueueDeclare(queue: "demo-queue",
                       durable: true,
                       exclusive: false,
                       autoDelete: false,
                       arguments: null);
inkz8wg9

inkz8wg92#

Exchange和queu需要连接。如果不这样做,消息就无法知道它将到达的队列地址。在QueueDeclare之后,它必须与Exchange地址绑定。我已经这样实现了它。如果需要,可以查看我在此处创建的repo。https://github.com/oguzhanKomcu/RabbitMQ_Sample
我想这就是缺失的功能。

public void BindQueu(string exName, string queuName, string routingKey)
     {
             channel.QueueBind(queuName,exName, routingKey);
     }

相关问题