异步RabbitMQ消费消息

hfwmuf9z  于 2023-06-23  发布在  RabbitMQ
关注(0)|答案(1)|浏览(118)

我试图从RabbitMQ获取一条消息,并异步执行并等待消息。当从Console应用程序调用下面的方法时,它可以工作。但是当试图从MVC控制器调用这个方法时,我会被tsc.Task卡住。使用RabbitMQ UI,我知道队列中有一条消息要消费。

public async Task<string> WaitForMessage(string queueName)
    {
        channel.QueueDeclare(queue: queueName,
        durable: true,
        exclusive: false,
        autoDelete: false,
        arguments: null);

        var consumer = new AsyncEventingBasicConsumer(channel);
        var tag = channel.BasicConsume(queueName, false, consumer);

        var tcs = new TaskCompletionSource<string>();

        consumer.Received += async (sender, eventArgs) =>
        {
            string message = Encoding.UTF8.GetString(eventArgs.Body.ToArray());
            await Task.Yield();
            channel.BasicAck(eventArgs.DeliveryTag, false);
            tcs.SetResult(message);
        };

        string result = await tcs.Task; //.ConfigureAwait(false);
        return result;
    }

我在两个应用程序中以相同的方式初始化rabbit MQ。当检查RabbitMQ的UI时,我可以看到连接是从MVC应用程序创建的。当设置BasicConsume时,我看到队列中不再有任何消息就绪,并且消息是Unacknowledged。当终止应用程序时,队列中的消息将再次获取状态就绪,并且不再是未确认的。
我使用的是RabbitMQ Client v6.4.0

2sbarzqh

2sbarzqh1#

我有冲突的System.Memory版本,所以在返回到我的received-method时触发了错误。
我通过添加捕获异常的channel.CallbackException发现了这一点。

相关问题