ОК, так что это моя первая попытка действительно использовать очередь, и я уверен, что здесь есть некоторые очевидные проблемы.
Этот код, тем не менее, работает для меня локально, но у меня возникают проблемы с развертыванием на моемпроверить лазурную среду.В лучшем случае он запускается один раз, но часто не совсем.Код подключается с помощью:
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