【问题标题】:RabbitMQ Listener is not firedRabbitMQ 侦听器未触发
【发布时间】:2022-06-10 18:21:43
【问题描述】:

我正在做一个 asp.netcore 6.0 项目

我正在使用 RabbitMQ 来实现购物车。即:付款成功后,应进行预订。

首先我要创建队列:

var factory = new ConnectionFactory
                    {
                        Uri = new Uri(_config.GetValue<string>("AmpqUrl")),
                    };

                    try
                    {
                        using var connection = factory.CreateConnection();
                        using var channel = connection.CreateModel();

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

                        var data = new
                        {
                            transactionId,
                            paymentConfirmedAt = DateTime.UtcNow,
                        };

                        var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data));

                        channel.BasicPublish(exchange: "", routingKey: "confirmed_payments", basicProperties: null, body: body);

                    }
                    catch (RabbitMQ.Client.Exceptions.BrokerUnreachableException ex)
                    {
                               Console.WriteLine("ex.ToString()");

                    }

和它的听众(另一个项目):

 public Task ListenPaymentConfimations(CancellationToken cancellationToken)
    {
        var factory = new ConnectionFactory
        {
            Uri = new Uri(_configuration.GetValue<string>("AmpqUrl")),
        };

        _connection = factory.CreateConnection();
        _channel = _connection.CreateModel();

        var confimedPaymentsConsumer = new EventingBasicConsumer(_channel);

        confimedPaymentsConsumer.Received += async (model, ea) =>
        {
            var body = ea.Body.ToArray();
            var response = Encoding.UTF8.GetString(body);

            var data = JsonConvert.DeserializeAnonymousType(response,
                new { transactionId = "", paymentConfirmedAt = "" }
            );

            var date = DateTime.Parse(data.paymentConfirmedAt).ToUniversalTime();

            using var scope = _serviceProvider.CreateScope();

            var dbService =
                scope.ServiceProvider.GetRequiredService<ITechneDbService>();

            var isPaymentConfimed = await dbService.UpdateCartPaymentConfirmedAt(data.transactionId, date);

            _logger.LogInformation("Transaction - {0}", data.transactionId);
            _logger.LogInformation("Transaction - {0}", date);
            _logger.LogInformation("Payment Confirmed - {0}", isPaymentConfimed);

            if (isPaymentConfimed)
            {
               // handle booking
            }
        };

        _channel.BasicConsume(queue: "confirmed_payments",
                     autoAck: true,
                     consumer: confimedPaymentsConsumer);

        return Task.CompletedTask;
    }

当我尝试预订酒店时,有时会点击 Listener,我可以成功预订。 但有时监听器未命中(创建队列时没有抛出异常)。

我不知道为什么会这样。

任何人都可以找到问题, 请帮帮我。

【问题讨论】:

    标签: c# asp.net-core rabbitmq


    【解决方案1】:

    更改连接的构造函数以指示应异步分派消费者。

    var factory = new ConnectionFactory
    {
        Uri = new Uri(_configuration.GetValue<string>("AmpqUrl")),
        DispatchConsumersAsync = true // <---- this
    };
    

    您可能还想改用AsyncEventingBasicConsumer 而不是EventingBasicConsumer

    【讨论】:

    • 谢谢。但这不起作用。
    【解决方案2】:

    您确定此队列只有一个消费者吗?也许不止一个,这就是为什么你错过了一些消息。您可以查看网络管理插件以了解此队列有多少消费者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 2017-03-01
      • 2019-05-14
      相关资源
      最近更新 更多