【问题标题】:Is it possible to use async/await for Publishing a message to RabbitMQ?是否可以使用 async/await 向 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;
}

【问题讨论】:

    标签: c# .net async-await rabbitmq


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多