Use this file to discover all available pages before exploring further.
The Azure Storage Queue provider offers a cost-effective, reliable messaging solution for applications using the Azure ecosystem. It’s perfect for high-volume scenarios where message ordering is not critical.
public class AzureStorageQueueOptions{ // Connection string to Azure Storage account public string ConnectionString { get; set; } // Alternative: Use individual components public string AccountName { get; set; } public string AccountKey { get; set; } public string SasToken { get; set; } // Default queue name if not specified per message public string DefaultQueueName { get; set; } = "messages"; // Whether to create queues automatically public bool CreateQueuesAutomatically { get; set; } = true;}
Message Processing
public class AzureStorageQueueDispatcherOptions : AzureStorageQueueOptions{ // How often to poll for new messages public TimeSpan PollingInterval { get; set; } = TimeSpan.FromSeconds(5); // Maximum messages to retrieve per poll public int BatchSize { get; set; } = 32; // Maximum concurrent message processing public int MaxConcurrentMessages { get; set; } = 32; // Message visibility timeout public TimeSpan VisibilityTimeout { get; set; } = TimeSpan.FromMinutes(5); // Maximum retry attempts for failed messages public int MaxRetryAttempts { get; set; } = 3; // Delay between retry attempts public TimeSpan RetryDelay { get; set; } = TimeSpan.FromSeconds(30);}
Advanced Settings
public class AzureStorageQueueAdvancedOptions{ // Custom queue name resolver public IQueueNameResolver QueueNameResolver { get; set; } // Message serialization options public JsonSerializerOptions SerializerOptions { get; set; } // Enable poison message handling public bool EnablePoisonMessageHandling { get; set; } = true; // Poison message queue suffix public string PoisonQueueSuffix { get; set; } = "-poison"; // Message time-to-live public TimeSpan? MessageTimeToLive { get; set; }}
builder.Services.AddSimpleMessageBusAzureStoragePublisher(options =>{ options.ConnectionString = builder.Configuration.GetConnectionString("AzureStorage"); // Managed identity will be used automatically});
public class CustomQueueNameResolver : IQueueNameResolver{ public string ResolveQueueName<T>(T message) where T : IMessage { // Route by message type return typeof(T).Name.ToLowerInvariant() + "-queue"; } public string ResolveQueueName(Type messageType) { return messageType.Name.ToLowerInvariant() + "-queue"; }}// Register the resolverbuilder.Services.AddSingleton<IQueueNameResolver, CustomQueueNameResolver>();
public class OrderProcessedHandler : IMessageHandler<OrderProcessedMessage>{ private readonly ILogger<OrderProcessedHandler> _logger; public OrderProcessedHandler(ILogger<OrderProcessedHandler> logger) { _logger = logger; } public async Task HandleAsync(OrderProcessedMessage message) { _logger.LogInformation("Processing order {OrderId}", message.OrderId); // Your processing logic here await ProcessOrder(message); }}
builder.Services.AddSimpleMessageBusAzureStorageDispatcher(options =>{ options.BatchSize = 32; // Retrieve up to 32 messages per poll options.MaxConcurrentMessages = 64; // Process up to 64 messages concurrently options.PollingInterval = TimeSpan.FromSeconds(1); // Poll more frequently});
Azure Storage client automatically pools connections, but you can optimize:
builder.Services.AddSimpleMessageBusAzureStoragePublisher(options =>{ options.ConnectionString = connectionString; // The client will automatically use connection pooling});