如何使用ServiceBusProcessor.ProcessErrorAsync

How to use ServiceBusProcessor.ProcessErrorAsync

如果不指定 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);

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);

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

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

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

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

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

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