Skip to content

Connect FlowMQ with AMQP .NET Client

FlowMQ's native support for AMQP 0.9.1 makes it an excellent choice for .NET applications that require reliable, message-based communication. This guide will walk you through using the official RabbitMQ .NET Client to connect to FlowMQ, declare queues, publish messages, and consume them.

Prerequisites

Before you start, ensure you have the following:

  • A running instance of FlowMQ.
  • The FlowMQ AMQP listener endpoint (e.g., your-flowmq-host:5672).
  • .NET 6 or later installed.
  • A .NET development environment like Visual Studio or the .NET CLI.

Installation

Add the RabbitMQ .NET Client to your project using the NuGet package manager.

bash
# Using .NET CLI
dotnet add package RabbitMQ.Client

# Or using Package Manager Console
Install-Package RabbitMQ.Client

Connecting to FlowMQ

First, you need to establish a connection to your FlowMQ broker and open a channel. All AMQP operations are performed on a channel.

csharp
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;
using System.Threading.Tasks;

class AmqpDotnetClient
{
    public static async Task Main(string[] args)
    {
        var factory = new ConnectionFactory() { HostName = "your-flowmq-host" };
        await using var connection = await factory.CreateConnectionAsync();
        await using var channel = await connection.CreateChannelAsync();
        {
            // ... declare, publish, and consume logic here ...
        }
    }
}

Declaring a Queue

For simplicity, we'll declare a queue and publish messages directly to it using the default exchange. The default exchange will route messages to the queue whose name matches the message's routing key.

csharp
        // Inside the 'using' block
        await channel.QueueDeclareAsync(
            queue: "hello-dotnet",
            durable: false,
            exclusive: false,
            autoDelete: false,
            arguments: null);

Publishing a Message

Now you can publish a message. The routing key must match the queue name to be delivered correctly.

csharp
        string message = "Hello FlowMQ from .NET!";
        var body = Encoding.UTF8.GetBytes(message);

        await channel.BasicPublishAsync(
            exchange: "",
            routingKey: "hello-dotnet",
            mandatory: false,
            basicProperties: new BasicProperties(),
            body: body);

        Console.WriteLine(" [x] Sent {0}", message);
        Console.ReadLine();

Consuming Messages

To consume messages, you can set up an EventingBasicConsumer, which will fire an event whenever a message is received.

csharp
        var consumer = new AsyncEventingBasicConsumer(channel);
        consumer.ReceivedAsync += (model, ea) =>
        {
            var receivedBody = ea.Body.ToArray();
            var receivedMessage = Encoding.UTF8.GetString(receivedBody);
            Console.WriteLine(" [x] Received {0}", receivedMessage);
            return Task.CompletedTask;
        };

        await channel.BasicConsumeAsync(
            queue: "hello-dotnet",
            autoAck: true,
            consumer: consumer);

        Console.WriteLine(" [*] Waiting for messages. Press [enter] to exit.");

Full Example

Here is a complete example that shows how to set up a publisher and a consumer.

Publisher (Publisher.cs)

csharp
using RabbitMQ.Client;
using System;
using System.Text;
using System.Threading.Tasks;

class Publisher
{
    public static async Task Main()
    {
        var factory = new ConnectionFactory() { HostName = "your-flowmq-host" };
        await using var connection = await factory.CreateConnectionAsync();
        await using var channel = await connection.CreateChannelAsync();

        await channel.QueueDeclareAsync(
            queue: "hello",
            durable: false,
            exclusive: false,
            autoDelete: false,
            arguments: null);

        string message = "Hello World!";
        var body = Encoding.UTF8.GetBytes(message);

        await channel.BasicPublishAsync(
            exchange: "",
            routingKey: "hello",
            mandatory: false,
            basicProperties: new BasicProperties(),
            body: body);
        Console.WriteLine(" [x] Sent {0}", message);
    }
}

Consumer (Consumer.cs)

csharp
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;
using System.Threading.Tasks;

class Consumer
{
    public static async Task Main()
    {
        var factory = new ConnectionFactory() { HostName = "your-flowmq-host" };
        await using var connection = await factory.CreateConnectionAsync();
        await using var channel = await connection.CreateChannelAsync();

        await channel.QueueDeclareAsync(
            queue: "hello",
            durable: false,
            exclusive: false,
            autoDelete: false,
            arguments: null);
        await channel.QueuePurgeAsync("hello");

        var consumer = new AsyncEventingBasicConsumer(channel);
        consumer.ReceivedAsync += (model, ea) =>
        {
            var body = ea.Body.ToArray();
            var message = Encoding.UTF8.GetString(body);
            Console.WriteLine(" [x] Received {0}", message);
            return Task.CompletedTask;
        };
        await channel.BasicConsumeAsync(
            queue: "hello",
            autoAck: true,
            consumer: consumer);

        Console.WriteLine(" Press [enter] to exit.");
        Console.ReadLine();
    }
}

Additional Resources

  • For more advanced scenarios and features, refer to the official RabbitMQ .NET Client Guide.
  • Explore FlowMQ's advanced features for AMQP integration.