gpt4 book ai didi

nservicebus - NServiceBus 是否有全局异常处理程序?

转载 作者:行者123 更新时间:2023-12-04 17:51:07 26 4
gpt4 key购买 nike

current advice on handling exceptions in NServiceBus是使用内置的设施。错误消息进入错误消息队列,并将日志写入磁盘。

但是,如果我想将我的错误发送到 AirBrake 之类的服务,该服务具有更好的功能来对类似的异常、指标和其他好东西进行分组,该怎么办?是否有我可以利用的全局异常处理程序?

最佳答案

正如原帖中提到的,推荐的解决方案是使用 ServicePulse 来监控错误。我目前工作的客户端正在使用定制的集中式记录器,我们希望 NServiceBus 在消息转发到错误队列时记录到此日志存储。

如果来自 NServiceBus 的异常包含原始异常,我们可以通过编辑 log4net 配置来实现这一点,目前 NServiceBus 只记录一条通用错误消息,没有关于导致失败的原因的详细信息。

NServiceBus 有一个名为 NServiceBus.Faults.ErrorsNotifications 的类,其中包含以下可观察对象:

  • MessageSentToErrorQueue
  • MessageHasFailedAFirstLevelRetryAttempt
  • MessageHasBeenSentToSecondLevelRetries

  • 您可以在端点启动时订阅这些 observable,如下例所示,当消息发送到错误队列时会记录错误:
    public class GlobalErrorHandler : IWantToRunWhenBusStartsAndStops
    {
    private readonly ILogger _logger;
    private readonly BusNotifications _busNotifications;
    readonly List<IDisposable> _notificationSubscriptions = new List<IDisposable>();

    public GlobalErrorHandler(ILogger logger, BusNotifications busNotifications)
    {
    _logger = logger;
    _busNotifications = busNotifications;
    }

    public void Start()
    {
    _notificationSubscriptions.Add(_busNotifications.Errors.MessageSentToErrorQueue.Subscribe(LogWhenMessageSentToErrorQueue));
    }

    public void Stop()
    {
    foreach (var subscription in _notificationSubscriptions)
    {
    subscription.Dispose();
    }
    }

    private void LogWhenMessageSentToErrorQueue(FailedMessage message)
    {
    var properties = new
    {
    MessageType = message.Headers["NServiceBus.EnclosedMessageTypes"],
    MessageId = message.Headers["NServiceBus.MessageId"],
    OriginatingMachine = message.Headers["NServiceBus.OriginatingMachine"],
    OriginatingEndpoint = message.Headers["NServiceBus.OriginatingEndpoint"],
    ExceptionType = message.Headers["NServiceBus.ExceptionInfo.ExceptionType"],
    ExceptionMessage = message.Headers["NServiceBus.ExceptionInfo.Message"],
    ExceptionSource = message.Headers["NServiceBus.ExceptionInfo.Source"],
    TimeSent = message.Headers["NServiceBus.TimeSent"]
    };

    _logger.Error("Message sent to error queue. " + properties, message.Exception);
    }
    }

    observable 是通过使用 Reactive Extensions 实现的,因此您必须安装 NuGet 包 Rx-Core 才能使其工作。

    关于nservicebus - NServiceBus 是否有全局异常处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16068970/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com