好的,这是我真正使用队列的第一次尝试,我相信这里有一些明显的问题。
但是此代码对我来说一直在本地工作,但是在部署到我的测试天蓝色环境中时遇到了问题。充其量它只能运行一次,但通常根本不运行。该代码通过以下方式进行连接:
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