10

I can't seem to find any information about how to async'ly Publish a message to RabbitMQ.

The examples I stumble across are usually about using async/await to retrieve/consume a message from RabbitMQ.

var consumer = new AsyncEventingBasicConsumer(model);

consumer.Received += async (o, a) =>
{
    Console.WriteLine("Message Get" + a.DeliveryTag);
    await Task.Yield();
};

Are there some examples or example code for this?

Edit

Here's some sample code I've been trying to play with:

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;
}
halfer
  • 19,824
  • 17
  • 99
  • 186
Pure.Krome
  • 84,693
  • 113
  • 396
  • 647

1 Answers1

1

At the current state, the RabbitMQ .NET client only supports asynchronous consumption.

If you only want to comply with a contract, you can return a Task.CompletedTask, like you did.

If you want to start some work and observe it later, you can wrap that code with a call to Task.Run or just put a await Task.Yield() where you want to break from synchronous to asynchronous.

Paulo Morgado
  • 14,111
  • 3
  • 31
  • 59