Skip to content

Handle Failures

Subscriber failures can happen during deserialization, handler execution or acknowledgement.

ServiceBus.Core exposes hooks that allow applications to observe and react to failures.


Processing Handler

subscriber.Received.Add(
    async (sender, args) =>
    {
        try
        {
            var message = args.Message.Data;

            Console.WriteLine(
                $"processing order: {message.OrderId}");

            args.Acknowledged = true;
            args.Requeue = false;
        }
        catch
        {
            args.Acknowledged = false;
            args.Requeue = true;

            throw;
        }

        await Task.CompletedTask;
    });

Exception Event

subscriber.OnException.Add(
    async (sender, args) =>
    {
        Console.WriteLine(
            $"subscriber exception: {args.Exception.Message}");

        await Task.CompletedTask;
    });

Max Retry Event

subscriber.OnMaxRetryFailed.Add(
    async (sender, args) =>
    {
        Console.WriteLine(
            $"max retry failed: {args.Exception.Message}");

        await Task.CompletedTask;
    });

Failure Flow

graph TD
    Message --> Handler
    Handler --> Success
    Handler --> Failure
    Failure --> Retry
    Retry --> Handler
    Failure --> ErrorHandling

Acknowledgement Strategy

Scenario Acknowledged Requeue
Message processed successfully true false
Temporary failure false true
Invalid message false false

Guidance

Keep failure handlers focused on observability and recovery.

Avoid placing complex business logic inside failure events.