QueueClient с BackgroundService не работает .NetCore2.2 - PullRequest
2 голосов
/ 22 апреля 2019

ОК, так что это моя первая попытка действительно использовать очередь, и я уверен, что здесь есть некоторые очевидные проблемы.

Этот код, тем не менее, работает для меня локально, но у меня возникают проблемы с развертыванием на моемпроверить лазурную среду.В лучшем случае он запускается один раз, но часто не совсем.Код подключается с помощью:

services.AddHostedService<ServiceBusListener>();

, а затем это мой основной код:

public class ServiceBusListener : BackgroundService
    {
        private readonly QueueSettings _scoreUpdatedQueueSettings;
        private readonly IEventMessageHandler _eventMessageHandler;
        private QueueClient _queueClient;

        public ServiceBusListener(IOptions<QueueSettings> scoreUpdatedQueueSettings,
            IEventMessageHandler eventMessageHandler)
        {
            _eventMessageHandler = eventMessageHandler;
            _scoreUpdatedQueueSettings = scoreUpdatedQueueSettings.Value;
        }

        public override Task StartAsync(CancellationToken cancellationToken)
        {
            _queueClient = new QueueClient(_scoreUpdatedQueueSettings.ServiceBusConnectionString,
                _scoreUpdatedQueueSettings.QueueName);

            var messageHandlerOptions = new MessageHandlerOptions(_eventMessageHandler.ExceptionReceivedHandler)
            {
                MaxConcurrentCalls = 1,
                AutoComplete = false
            };

            _queueClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions);

            return Task.CompletedTask;
        }

        public override Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }

        public async Task ProcessMessagesAsync(Message message, CancellationToken token)
        {
            await _eventMessageHandler.ProcessMessagesAsync(message, token);

            await _queueClient.CompleteAsync(message.SystemProperties.LockToken);
        }

        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
            }

            return Task.CompletedTask;
        }
    }

Как уже упоминалось локально, это работает нормально, каждый раз, когда сообщение попадает в очередь, моя соответствующаяфункции выполняются.

Такое ощущение, что какой-то код должен жить в ExecuteAsync, но я не хочу создавать обработчик каждый раз, когда я делаю?

Для контекста это выполняется в приложении wepВ Azure я сделал это так, поскольку у нас есть API, который можно использовать для управления некоторыми связанными данными.

В сети, кажется, мало что из этого, поэтому любая помощь будет признательна.

TIA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...