azureasp.net-coreazureservicebus.net-5azure-servicebus-queues

What is the Azure Bus Service Queue Listener replacement for .NET 5+?


The SDK for .NET 5 has changed and the package Microsoft.Azure.ServiceBus will be deprecated, so the IQueueClient no longer exists.

What is the latest solution to create a SB Queue listener?


Solution

  • Using the ServiceBusProcessor

    string connectionString = "<connection_string>";
    string queueName = "<queue_name>";
    
    // since ServiceBusClient implements IAsyncDisposable we create it with "await using"
    await using var client = new ServiceBusClient(connectionString);
    
    var options = new ServiceBusProcessorOptions
    {
        // By default or when AutoCompleteMessages is set to true, the processor will complete the message after executing the message handler
        // Set AutoCompleteMessages to false to [settle messages](https://learn.microsoft.com/en-us/azure/service-bus-messaging/message-transfers-locks-settlement#peeklock) on your own.
        // In both cases, if the message handler throws an exception without settling the message, the processor will abandon the message.
        AutoCompleteMessages = false,
    
        // I can also allow for multi-threading
        MaxConcurrentCalls = 2
    };
    
    // create a processor that we can use to process the messages
    await using ServiceBusProcessor processor = client.CreateProcessor(queueName, options);
    
    // configure the message and error handler to use
    processor.ProcessMessageAsync += MessageHandler;
    processor.ProcessErrorAsync += ErrorHandler;
    
    async Task MessageHandler(ProcessMessageEventArgs args)
    {
        string body = args.Message.Body.ToString();
        Console.WriteLine(body);
    
        // we can evaluate application logic and use that to determine how to settle the message.
        await args.CompleteMessageAsync(args.Message);
    }
    
    Task ErrorHandler(ProcessErrorEventArgs args)
    {
        // the error source tells me at what point in the processing an error occurred
        Console.WriteLine(args.ErrorSource);
        // the fully qualified namespace is available
        Console.WriteLine(args.FullyQualifiedNamespace);
        // as well as the entity path
        Console.WriteLine(args.EntityPath);
        Console.WriteLine(args.Exception.ToString());
        return Task.CompletedTask;
    }
    
    // start processing
    await processor.StartProcessingAsync();