是否可以使用 async/await 向 RabbitMQ 发布消息?

Posted

技术标签:

【中文标题】是否可以使用 async/await 向 RabbitMQ 发布消息?【英文标题】:Is it possible to use async/await for Publishing a message to RabbitMQ? 【发布时间】:2019-04-25 13:54:02 【问题描述】:

我似乎找不到任何关于如何异步向 RabbitMQ 发布消息的信息。

I stumble across 的示例通常是关于使用 async/await 来检索/使用 来自 RabbitMQ 的消息。

var consumer = new AsyncEventingBasicConsumer(model);

consumer.Received += async (o, a) =>

    Console.WriteLine("Message Get" + a.DeliveryTag);
    await Task.Yield();
;

是否有一些示例或示例代码?

编辑

这是我一直在尝试使用的一些示例代码:

public Task AddMessageAsync(string content,
                            TimeSpan? timeToLive,
                            TimeSpan? initialVisibilityDelay,
                            CancellationToken cancellationToken)

    _logger.LogDebug("Starting to add a Message to queue. content", content);

    CheckRabbitMQPolicy(_logger).Execute(() =>
    
        using (var connection = _factory.CreateConnection())
        
            _logger.LogDebug("Created a connection to factory.");

            using (var channel = connection.CreateModel())
            
                _logger.LogDebug("Created a channel");

                AddMessageToRabbitMQPolicy(_logger).Execute(() =>
                
                    _logger.LogDebug("Check or Create a queue 'queueName'", _queueName);
                    channel.QueueDeclare(queue: _queueName,
                                            durable: false, // Could be TRUE
                                            exclusive: false,
                                            autoDelete: false,
                                            arguments: null);
                    _logger.LogDebug("'queueName' exists or was created.", _queueName);

                    var body = Encoding.UTF8.GetBytes(content);

                    _logger.LogDebug("About to publish message to queue 'queueName'", _queueName);

                    //var foo = new AsyncEventingBasicPublish()
                    channel.BasicPublish(exchange: "",
                                            routingKey: _queueName,
                                            basicProperties: null,
                                            body: body);
                    _logger.LogDebug("Message published to queue 'queueName'", _queueName);
                );
            
        
    );

    return Task.CompletedTask;

【问题讨论】:

【参考方案1】:

目前状态下,RabbitMQ .NET 客户端只支持异步消费。

如果您只想遵守合同,可以像以前一样返回Task.CompletedTask

如果您想开始一些工作并稍后观察它,您可以通过调用 Task.Run 来包装该代码,或者只需将 await Task.Yield() 放在您想要从同步中断为异步的位置。

【讨论】:

以上是关于是否可以使用 async/await 向 RabbitMQ 发布消息?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Java 没有 async/await?

是否可以在没有 async/await 的情况下从 Promise 返回已解析的值?

Vue.js `mounted` 中是不是可以使用`async/await`?

使用 async/await 并行执行任务继续

async/await小知识点

使用 async/await 或其他东西