当我的 .NET 7 辅助服务应用程序无法连接到服务总线实例时,我希望它出错/退出。我在日志中看到错误:
[ERR] 使用 ErrorSource 调用 ErrorHandler:接收,FullyQualifiedNamespace:EntityPath,异常:Azure.Messaging.ServiceBus.ServiceBusException:请求的名称有效,但没有数据...
但是,我的代码没有抛出任何异常,它只是不断地重试而不是退出:
[WRN] RunOperation 遇到异常,将重试。异常:Azure.Messaging.ServiceBus.ServiceBusException:请求的名称有效,但找不到请求类型的数据。错误代码:NoData(服务通信问题)。
我找不到这些日志来自哪里,或者拦截异常,大概来自Azure.Messaging.ServiceBus
问题:当应用程序无法连接到服务总线/发生上述情况时,如何让应用程序抛出异常并退出?
实施细节
在我的应用程序中,我配置了一个工作人员,以及
ServiceBusClient
中的 program.cs
,如下所示:
services.AddHostedService<ServiceBusWorker>();
services.AddAzureClients(clientsBuilder =>
{
clientsBuilder.AddServiceBusClient(serviceBusConfiguration?.ConnectionString)
.WithName(serviceBusConfiguration?.MyQueue);
});
然后在我的工人中我构建如下::
using Azure.Messaging.ServiceBus;
public ServiceBusWorker(IAzureClientFactory<ServiceBusClient> serviceBusClientFactory)
{
_serviceBusClientFactory = serviceBusClientFactory;
var connectionString = serviceBusConfiguration.Value.ConnectionString;
_requestQueueClient = _serviceBusClientFactory.CreateClient(_requestQueue);
worker 启动如下:
public async Task StartAsync(CancellationToken cancellationToken)
{
try
{
await using var requestProcessor = _requestQueueClient.CreateProcessor(_requestQueue, _serviceBusProcessorOptions);
// configure the message and error handler to use
requestProcessor.ProcessMessageAsync += ProcessMessageAsync;
requestProcessor.ProcessErrorAsync += ErrorHandler;
await requestProcessor.StartProcessingAsync(cancellationToken);
while (!cancellationToken.IsCancellationRequested) { await Task.Delay(1000, cancellationToken); } //Need to improve. Required to keep the requestProcessor alive for now until better solution.
}
catch (Exception ex)
{
_logger.LogError(ex, "Error when starting the request processor");
throw;
}
}
我尝试过的
我尝试在program.cs中配置重试策略,如下所示,但我认为这没有什么区别,因为它与消息重试有关,而不是我的场景:
services.AddAzureClients(clientsBuilder =>
{
var serviceBusRetryOptions = new ServiceBusRetryOptions
{
MaxRetries = 3,
Delay = TimeSpan.FromSeconds(2),
TryTimeout = TimeSpan.FromSeconds(30)
};
clientsBuilder
.AddServiceBusClient(serviceBusConfiguration?.ConnectionString)
.ConfigureOptions(options =>
{
options.RetryOptions = serviceBusRetryOptions;
})
.WithName(serviceBusConfiguration?.RequestQueue);
clientsBuilder
.AddServiceBusClient(serviceBusConfiguration?.ConnectionString)
.ConfigureOptions(options =>
{
options.RetryOptions = serviceBusRetryOptions;
})
.WithName(serviceBusConfiguration?.ResponseQueue);
});
IHostApplicationLifetime
注入到您的工作线程中,并调用 _hostApplicationLifetime.StopApplication()
来优雅地停止您的应用程序。