如何使用 ServiceBusProcessor.ProcessErrorAsync

Yur*_*hov 5 c# azureservicebus

如果不指定 ProcessMessageAsync 和 ProcessErrorAsync,则无法使用 ServiceBusProcessor。第一个方法是什么,很清楚,但我不确定在 ProcessErrorAsync 中做什么?以下方法相同吗?

var client = new ServiceBusClient(connectionString);
var processor = _client.CreateProcessor(queueName);

processor.ProcessMessageAsync += async arg =>
{
    try
    {
        //process message
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
};

processor.ProcessErrorAsync += arg =>
{
    return Task.CompletedTask;
};

await _processor.StartProcessingAsync(cancellationToken);
Run Code Online (Sandbox Code Playgroud)

var client = new ServiceBusClient(connectionString);
var processor = _client.CreateProcessor(queueName);

processor.ProcessMessageAsync += async arg =>
{
    //process message
};

processor.ProcessErrorAsync += arg =>
{
    Console.WriteLine(ex.Message);
    return Task.CompletedTask;
};

await _processor.StartProcessingAsync(cancellationToken);
Run Code Online (Sandbox Code Playgroud)

Jes*_*ire 5

ProcessMessageAsync是一个处理程序,每次从服务总线实例读取消息并需要处理消息时都会调用该处理程序。这是处理消息的业务逻辑所在的位置。

ProcessErrorAsync是一个处理程序,允许您观察处理器操作期间发生的异常 - 无论是在消息处理代码中还是在处理器基础结构本身中。

该处理器具有弹性,可以尽力从问题中恢复并继续处理。因此,它将摆脱大多数异常,将它们呈现给处理程序,然后继续前进。错误处理程序是向您的应用程序通知问题并采取适合您的应用程序的操作的方式。

至于您应该在处理程序中做什么,很大程度上取决于您的应用程序及其需求。至少,大多数应用程序希望了解何时发生错误并记录它们,以便稍后需要进行分析。您可能还想使用它来检测有害消息或其他处理问题,并采取适合您的应用程序的操作。

处理器不了解应用程序的设计或需求,也不了解其托管环境。这意味着它无法做出明智的决策来决定什么时候通常是短暂的问题应该是致命的,或者什么时候应用程序生态系统中存在更大的问题。重要的是要记住,您的应用程序负责了解错误模式并以不明显的方式确定应用程序或处理器是否不健康。

例如,如果处理器无法到达您的服务总线实例,它将继续永远重试。如果您的应用程序在一段时间内持续看到这些异常,则可能是主机网络不健康的迹象,您的应用程序可能会选择停止处理并重置主机。同样,如果您的应用程序需要传入消息的特定架构,而发布到服务总线实例的消息不正确,则处理器将继续尝试处理它们,但您的应用程序应该能够更好地识别更大的问题并采取措施采取适当的行动。