簡體   English   中英

具有.NEt核心的Rabbit MQ異常

[英]Rabbit MQ Exception with .NEt core

以下是我收到的異常.Net core and rabbitMQ: The AMQP operation was interrupted: AMQP close-reason, initiated by Peer, code=405, text='RESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'demo-queue' in虛擬主機'/'。 它可能最初是在另一個連接上聲明的,或者獨占屬性值與原始聲明的值不匹配。', 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);

如果我更改我在生產者或消費者中給出的隊列名稱,這是正確的做法還是正確的方法? 這是處理這個問題的正確方法?

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);

交換和隊列需要連接。 如果不這樣做,消息將無法知道它將 go 發送到的隊列地址。 QueueDeclare 后,必須綁定交易所地址。 我是這樣實現的。 如果需要,您可以查看我在此處創建的回購協議。 https://github.com/oguzhanKomcu/RabbitMQ_Sample

我認為這是丟失的 function。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM