Skip to content

Subscriber Channel Events

Subscribers expose RabbitMQ channel-level events through the common IAsyncBrokerClient contract.

This allows consumer applications to observe broker/channel behavior while consuming messages.


Enable Channel Events

Channel events are enabled through the subscriber descriptor.

var descriptor = new SubscriberBoundDescriptor
{
    EnableChannelEvents = true,

    Queue = new QueueDescriptor
    {
        Name = "orders.created",
        Durable = true
    },

    Exchange = new ExchangeDescriptor
    {
        Name = "orders",
        Type = ExchangeTypes.Direct,
        Durable = true
    },

    Binder = new BinderDescriptor
    {
        RoutingKey = "orders.created"
    }
};

Register Event Handlers

A subscriber exposes:

IDelegateHandler<ChannelEventArgs> OnChannelEventFired { get; }

You can register one or more handlers.

subscriber.OnChannelEventFired.Add(
    async (sender, args) =>
    {
        var eventText = args.ToString();

        Console.WriteLine(
            $"channel event: {DateTime.UtcNow:u}, {eventText}");

        await Task.CompletedTask;
    });

EventTag

ChannelEventArgs.EventTag identifies the channel event raised by the RabbitMQ client.

Common event tags include:

EventTag Description
FlowControl RabbitMQ changed the channel flow-control state.
CallbackException RabbitMQ raised a callback exception on the channel.
ModelShutdown The channel/model was shut down.

Multiple Handlers

Multiple handlers can be registered.

subscriber.OnChannelEventFired.Add(
    async (sender, args) =>
    {
        Console.WriteLine(args.EventTag);

        await Task.CompletedTask;
    });

subscriber.OnChannelEventFired.Add(
    async (sender, args) =>
    {
        // Send the event to telemetry or monitoring.

        await Task.CompletedTask;
    });

Handler Errors

If a channel event handler throws an exception, the exception belongs to the handler logic.

Keep handlers lightweight and resilient.

subscriber.OnChannelEventFired.Add(
    async (sender, args) =>
    {
        try
        {
            Console.WriteLine(args.ToString());
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception.Message);
        }

        await Task.CompletedTask;
    });

When To Use

Subscriber channel events are useful for:

  • diagnostics;
  • observability;
  • broker troubleshooting;
  • monitoring flow-control events;
  • detecting channel shutdowns.

Difference From Message Handling

Channel events are not message delivery events.

Feature Purpose
Received Handles application messages delivered to the subscriber.
OnChannelEventFired Observes RabbitMQ channel-level events.

Use Received to process messages.

Use OnChannelEventFired to observe channel behavior.