2013-04-17 17 views
5

current advice on handling exceptions in NServiceBus, yerleşik olan tesisleri kullanmaktır. Eritilmiş mesajlar hata mesajı sırasına gider ve bir kayıt diske yazılır.NServiceBus için küresel bir istisna işleyicisi var mı?

Hatalarımı, benzer istisnaları, metrikleri ve diğer iyi şeyleri gruplandırmak için daha iyi bir işlevselliğe sahip AirBrake gibi bir hizmete göndermek istersem ne olur? İçine girebileceğim global bir istisna eylemcisi var mı?

cevap

4

hatalarını izlemek için ServicePulse kullanmaktır. Şu anda çalışmakta olduğum istemci, özel olarak yapılmış bir merkezi günlük kaydedici kullanıyor ve iletiler hata sırasına yönlendirildiğinde, bu günlük deposuna oturum açmak için NServiceBus istiyoruz.

NServiceBus istisnası ilk istisna dahil edilmişse, log4net yapılandırmasını düzenleyerek bunu gerçekleştirebildik, şu anda NServiceBus başarısızlığa neyin neden olduğu hakkında hiçbir ayrıntı içermeyen genel bir hata iletisi kaydeder.

NServiceBus aşağıdaki gözlenebilirleri içeren bir sınıf adında NServiceBus.Faults.ErrorsNotifications vardır:

  • MessageSentToErrorQueue
  • MessageHasFailedAFirstLevelRetryAttempt
  • MessageHasBeenSentToSecondLevelRetries

Bu gözlenebilirlere abone olabilirsiniz uç nokta aşağıdaki örnekte olduğu gibi başlar, mesajlar se seçilerek bir hatayı günlüğe kaydeder nt hata kuyruğuna:

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

gözlenebilen Reaktif Uzantıları kullanılarak uygulanır, bu nedenle bunun işe yaraması için Nuget paketini Rx Çekirdekli yüklemek zorunda kalacaktır.

1

IManageMessageFailures denilen ama muhtemelen siz verseydiniz kendi için gitmek kaybedecek böylece İkinci Seviye Denemesi ile conjucntion onu kullanabilirsiniz inanmıyorum.

Hataları, SQL Server'a log4net ile yazabilirsiniz ve buradan, daha sonra gönderildiği gibi hata tablosundaki her hatayı işaretleyerek API'lerini AirBrake'e iletebilirsiniz.

+0

İkinci düzey deneme sürümleriyle kullanamıyorsanız gerçekten çok berbat. Yine de teşekkürler! –

1

Hata sırasını besleyen ve verileri AirBrake'e yükleyen özel bir uç nokta oluşturmanızı öneririm.

Yan not: v4.0 | 4.1, hatalar için güzel yönetim/sorgulama yetenekleri sunan güzel bir Rest-Api ile birlikte gelir. Profiler ve Ops gibi araçlar bu verileri size çeşitli şekillerde sunmak için kullanacaktır. orijinal sonrası önerilen çözüm belirtildiği gibi

http://particular.net/service-platform

+0

Bu soru/cevap biraz eski, ancak bu yana küresel bir işleyici olarak var olmamanın sebebinin, her bir başarısızlığın iş gereksinimleri bağlamında dikkate alınması gerektiğinden ötürü öğrendim. –

1

Serilog'a geçtik, NServiceBus için mükemmel bir günlük kaydını destekliyor. Günlük olaylarınızı istediğiniz yere gönderecek özel bir Serilog havuzu oluşturmak oldukça kolaydır.

İlgili konular