Мой приемник служебной шины Azure закрывается из-за тайм-аута простоя, и я не нашел способа это исправить. ⇐ C#
Мой приемник служебной шины Azure закрывается из-за тайм-аута простоя, и я не нашел способа это исправить.
У меня есть довольно простое приложение .NET 6, единственная цель которого — получать сообщения от служебной шины Azure и обрабатывать их. Когда мое приложение работает, я очень доволен результатом, и оно соответствует ожидаемой мной бизнес-логике.
Дело в том, что после прослушивания сообщения и его обработки мой приемник служебной шины Azure отключается, и ссылка закрывается.
Вот несколько журналов моего развернутого приложения (это образ Docker, развернутый на AKS через jenkins/argocd для информации):
информация: Inventory_Create_Worker.API.Consumer.CreateInventoryConsumerService[0] Сообщение получено и обработано: {"Title":"событие создания инвентаря","Description":"Извлечение из файла Excel","Событие":":CONFIDENTIAL_INVENTORY_DATA"} информация: Azure.Messaging.ServiceBus[38] Ссылка на прием закрыта. Идентификатор: очередь-инвентаризация-создание-dev-xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx, SessionId: , linkException: Azure.Messaging.ServiceBus.ServiceBusException: ссылка 'amqps://personaldevservicebus-development.servicebus.windows.net/-f1a43db3;0:5:6:source(address:/queue-inventory-creation- dev,filter:[])' является принудительно отделенным. Код: агрегат-ссылка1318524517. Подробности: AmqpMessagePartitioningEntityMessageCache.IdleTimerExpired: тайм-аут простоя в секундах: 900. (Общая ошибка). Информацию об устранении неполадок см. на странице https://aka.ms/azsdk/net/servicebus/Exc ... oubleshoot.. Вот как я внедряю в ioc IAzureClientFactory:
Services.AddAzureClients(clientsBuilder => { clientBuilder.AddServiceBusClient(connectionString:azureQueueConfig.ConnectionString) .WithName(ConfirmationCreateServiceBusClientName) .ConfigureOptions(опции => { options.RetryOptions.Delay = TimeSpan.FromSeconds(2); options.RetryOptions.MaxDelay = TimeSpan.FromMinutes(2); options.ConnectionIdleTimeout = TimeSpan.FromMinutes(5); options.RetryOptions.MaxRetries = 5; }); }); Поначалу у меня не было .ConfigureOptions, и я чувствовал, что моя проблема, вероятно, кроется в нем.
Вот моя фоновая служба, которая принимает сообщения из служебной шины Azure:
с использованием общего; использование Shared.AzureServiceBus; использование Shared.Interfaces; использование Shared.Interfaces.Infrastructure; использование Shared.Interfaces.Provider; использование Shared.Interfaces.Service; используя Shared.Models.Config; использование Shared.RabbitMq; использование Shared.Services; использование Inventory_Create_Worker.Application.Common.Interfaces.Authentication; использование Inventory_Create_Worker.Infrastructure.Authentication; использование Inventory_Create_Worker.Shared.Constants; использование Microsoft.Extensions.Azure; использование Microsoft.Extensions.Configuration; использование Microsoft.Extensions.DependencyInjection; использование Microsoft.Extensions.Logging; использование Microsoft.Extensions.Options; использование статического Inventory_Create_Worker.Shared.Constants.AzureConstant; общедоступный класс CreateInventoryConsumerService: BackgroundService { частный только для чтения ILogger _logger; частный ServiceBusReceiver _serviceBusReceiver; частный ServiceBusClient _serviceBusClient; частный только для чтения IAzureClientFactory _azureClientFactory; частный только для чтения AzureQueueConfig _azureQueueConfig; частный только для чтения IServiceProvider _serviceProvider; public CreateInventoryConsumerService(IAzureClientFactory serviceBusClientFactory, ILogger регистратор, IOptions azureQueueOptions, поставщик услуг IServiceProvider) { _logger = регистратор; _serviceProvider = поставщик услуг; _azureClientFactory = serviceBusClientFactory; _azureQueueConfig = azureQueueOptions.Value; _serviceBusClient = _azureClientFactory.CreateClient(имя: AzureConstant.InventoryCreateServiceBusClientName); _serviceBusReceiver = _serviceBusClient.CreateReceiver(queueName: _azureQueueConfig.QueueName); } защищенное переопределение асинхронной задачи ExecuteAsync (CancellationToken StopToken) { пытаться { вар полученное сообщение = ждут _serviceBusReceiver.ReceiveMessageAsync (cancellationToken: StopToken); если (receivedMessage!= ноль) { используя (область var = _serviceProvider.CreateScope()) { вар serviceProvider = объем.ServiceProvider; вар посредник = serviceProvider.GetRequiredService(); Console.WriteLine("НАЧИНАЕМ ПОЛЬЗОВАТЬСЯ СЕРВИСОМ"); вар createInventoryEvent = Encoding.UTF8.GetString(receivedMessage.Body); Console.WriteLine("var createInventoryEvent = Encoding.UTF8.GetString DONE"); Команда CreateInventoryFromEventCommand = new(createInventoryEvent); Консоль.WriteLine( «Команда CreateInventoryFromEventCommand = new(createInventoryEvent); DONE»); ожидайте mediator.Send(команда, StopToken); Console.WriteLine("_mediator.Send(команда) DONE"); _logger.LogInformation("Сообщение получено и обработано: " + createInventoryEvent); Console.WriteLine("Сообщение получено и обработано: " + createInventoryEvent); } } } поймать (Исключение ex) { _logger.LogError($"Не удалось выполнить сообщение в Inventory_Create_Worker.CreateInventoryConsumerService.ExecuteAsync, возникло исключение: {ex.Message} )"); Console.WriteLine($"Не удалось выполнить сообщение в Inventory_Create_Worker.CreateInventoryConsumerService.ExecuteAsync, возникло исключение: {ex.Message}"); РекреатеServiceBusInstances(); } } /// /// Когда наша служебная шина выходит из строя, нам нужно ее воссоздать. /// В противном случае мы больше не прослушиваем события служебной шины Azure, и наша потребительская служба инвентаризации больше не гарантируется. /// частная пустота RecreateServiceBusInstances() { пытаться { _logger.LogInformation("Воссоздание нового ServiceBusReceiver и нового экземпляра ServiceBusClient"); Console.WriteLine("Воссоздание нового ServiceBusReceiver и нового экземпляра ServiceBusClient"); _serviceBusClient = _azureClientFactory.CreateClient(имя: AzureConstant.InventoryCreateServiceBusClientName); _serviceBusReceiver = _serviceBusClient.CreateReceiver(queueName: _azureQueueConfig.QueueName); } поймать (Исключение ex) { _logger.LogError($"Не удалось воссоздать экземпляры ServiceBus: {ex.Message}"); Console.WriteLine($"Не удалось воссоздать экземпляры ServiceBus: {ex.Message}"); } } }
У меня есть довольно простое приложение .NET 6, единственная цель которого — получать сообщения от служебной шины Azure и обрабатывать их. Когда мое приложение работает, я очень доволен результатом, и оно соответствует ожидаемой мной бизнес-логике.
Дело в том, что после прослушивания сообщения и его обработки мой приемник служебной шины Azure отключается, и ссылка закрывается.
Вот несколько журналов моего развернутого приложения (это образ Docker, развернутый на AKS через jenkins/argocd для информации):
информация: Inventory_Create_Worker.API.Consumer.CreateInventoryConsumerService[0] Сообщение получено и обработано: {"Title":"событие создания инвентаря","Description":"Извлечение из файла Excel","Событие":":CONFIDENTIAL_INVENTORY_DATA"} информация: Azure.Messaging.ServiceBus[38] Ссылка на прием закрыта. Идентификатор: очередь-инвентаризация-создание-dev-xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx, SessionId: , linkException: Azure.Messaging.ServiceBus.ServiceBusException: ссылка 'amqps://personaldevservicebus-development.servicebus.windows.net/-f1a43db3;0:5:6:source(address:/queue-inventory-creation- dev,filter:[])' является принудительно отделенным. Код: агрегат-ссылка1318524517. Подробности: AmqpMessagePartitioningEntityMessageCache.IdleTimerExpired: тайм-аут простоя в секундах: 900. (Общая ошибка). Информацию об устранении неполадок см. на странице https://aka.ms/azsdk/net/servicebus/Exc ... oubleshoot.. Вот как я внедряю в ioc IAzureClientFactory:
Services.AddAzureClients(clientsBuilder => { clientBuilder.AddServiceBusClient(connectionString:azureQueueConfig.ConnectionString) .WithName(ConfirmationCreateServiceBusClientName) .ConfigureOptions(опции => { options.RetryOptions.Delay = TimeSpan.FromSeconds(2); options.RetryOptions.MaxDelay = TimeSpan.FromMinutes(2); options.ConnectionIdleTimeout = TimeSpan.FromMinutes(5); options.RetryOptions.MaxRetries = 5; }); }); Поначалу у меня не было .ConfigureOptions, и я чувствовал, что моя проблема, вероятно, кроется в нем.
Вот моя фоновая служба, которая принимает сообщения из служебной шины Azure:
с использованием общего; использование Shared.AzureServiceBus; использование Shared.Interfaces; использование Shared.Interfaces.Infrastructure; использование Shared.Interfaces.Provider; использование Shared.Interfaces.Service; используя Shared.Models.Config; использование Shared.RabbitMq; использование Shared.Services; использование Inventory_Create_Worker.Application.Common.Interfaces.Authentication; использование Inventory_Create_Worker.Infrastructure.Authentication; использование Inventory_Create_Worker.Shared.Constants; использование Microsoft.Extensions.Azure; использование Microsoft.Extensions.Configuration; использование Microsoft.Extensions.DependencyInjection; использование Microsoft.Extensions.Logging; использование Microsoft.Extensions.Options; использование статического Inventory_Create_Worker.Shared.Constants.AzureConstant; общедоступный класс CreateInventoryConsumerService: BackgroundService { частный только для чтения ILogger _logger; частный ServiceBusReceiver _serviceBusReceiver; частный ServiceBusClient _serviceBusClient; частный только для чтения IAzureClientFactory _azureClientFactory; частный только для чтения AzureQueueConfig _azureQueueConfig; частный только для чтения IServiceProvider _serviceProvider; public CreateInventoryConsumerService(IAzureClientFactory serviceBusClientFactory, ILogger регистратор, IOptions azureQueueOptions, поставщик услуг IServiceProvider) { _logger = регистратор; _serviceProvider = поставщик услуг; _azureClientFactory = serviceBusClientFactory; _azureQueueConfig = azureQueueOptions.Value; _serviceBusClient = _azureClientFactory.CreateClient(имя: AzureConstant.InventoryCreateServiceBusClientName); _serviceBusReceiver = _serviceBusClient.CreateReceiver(queueName: _azureQueueConfig.QueueName); } защищенное переопределение асинхронной задачи ExecuteAsync (CancellationToken StopToken) { пытаться { вар полученное сообщение = ждут _serviceBusReceiver.ReceiveMessageAsync (cancellationToken: StopToken); если (receivedMessage!= ноль) { используя (область var = _serviceProvider.CreateScope()) { вар serviceProvider = объем.ServiceProvider; вар посредник = serviceProvider.GetRequiredService(); Console.WriteLine("НАЧИНАЕМ ПОЛЬЗОВАТЬСЯ СЕРВИСОМ"); вар createInventoryEvent = Encoding.UTF8.GetString(receivedMessage.Body); Console.WriteLine("var createInventoryEvent = Encoding.UTF8.GetString DONE"); Команда CreateInventoryFromEventCommand = new(createInventoryEvent); Консоль.WriteLine( «Команда CreateInventoryFromEventCommand = new(createInventoryEvent); DONE»); ожидайте mediator.Send(команда, StopToken); Console.WriteLine("_mediator.Send(команда) DONE"); _logger.LogInformation("Сообщение получено и обработано: " + createInventoryEvent); Console.WriteLine("Сообщение получено и обработано: " + createInventoryEvent); } } } поймать (Исключение ex) { _logger.LogError($"Не удалось выполнить сообщение в Inventory_Create_Worker.CreateInventoryConsumerService.ExecuteAsync, возникло исключение: {ex.Message} )"); Console.WriteLine($"Не удалось выполнить сообщение в Inventory_Create_Worker.CreateInventoryConsumerService.ExecuteAsync, возникло исключение: {ex.Message}"); РекреатеServiceBusInstances(); } } /// /// Когда наша служебная шина выходит из строя, нам нужно ее воссоздать. /// В противном случае мы больше не прослушиваем события служебной шины Azure, и наша потребительская служба инвентаризации больше не гарантируется. /// частная пустота RecreateServiceBusInstances() { пытаться { _logger.LogInformation("Воссоздание нового ServiceBusReceiver и нового экземпляра ServiceBusClient"); Console.WriteLine("Воссоздание нового ServiceBusReceiver и нового экземпляра ServiceBusClient"); _serviceBusClient = _azureClientFactory.CreateClient(имя: AzureConstant.InventoryCreateServiceBusClientName); _serviceBusReceiver = _serviceBusClient.CreateReceiver(queueName: _azureQueueConfig.QueueName); } поймать (Исключение ex) { _logger.LogError($"Не удалось воссоздать экземпляры ServiceBus: {ex.Message}"); Console.WriteLine($"Не удалось воссоздать экземпляры ServiceBus: {ex.Message}"); } } }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Получение ошибки тайм-аута — увеличьте значение тайм-аута отправки при привязке.
Anonymous » » в форуме C# - 0 Ответы
- 62 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Получение ошибки тайм-аута — увеличьте значение тайм-аута отправки при привязке.
Anonymous » » в форуме C# - 0 Ответы
- 46 Просмотры
-
Последнее сообщение Anonymous
-