具有BackgroundService的QueueClient无法工作.NetCore2.2

时间:2019-04-22 10:22:52

标签: c# azure azure-servicebus-queues asp.net-core-2.2

好的,这是我真正使用队列的第一次尝试,我相信这里有一些明显的问题。

但是此代码对我来说一直在本地工作,但是在部署到我的测试天蓝色环境中时遇到了问题。充其量它只能运行一次,但通常根本不运行。该代码通过以下方式进行连接:

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中,但是我不想每隔x个创建一个处理程序吗?

对于上下文,它是在蔚蓝的Wep应用程序上运行的,我这样做是因为我们有一个可以点击以管理一些相关数据的api。

网上似乎没有什么可以解决的,所以我们将不胜感激。

TIA

0 个答案:

没有答案