C# ServiceBusClient 无法连接服务总线时如何退出应用程序

问题描述 投票:0回答:1

当我的 .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);
});
c# .net-core azureservicebus .net-7.0 servicebus
1个回答
0
投票

您可以将

IHostApplicationLifetime
注入到您的工作线程中,并调用
_hostApplicationLifetime.StopApplication()
来优雅地停止您的应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.