2013-04-17 13 views
5

current advice on handling exceptions in NServiceBus utilizza le funzionalità integrate. I messaggi errati vengono inviati alla coda dei messaggi di errore e un registro viene scritto sul disco.Esiste un gestore di eccezioni globale per NServiceBus?

Ma cosa succede se voglio inviare i miei errori a un servizio come AirBrake che ha funzionalità migliori per raggruppare eccezioni, metriche e altre cose simili? C'è un gestore di eccezioni globale a cui posso attingere?

risposta

4

Come accennato nel post originale soluzione proposta è quella di utilizzare ServicePulse per il monitoraggio degli errori. Il client al quale lavoro attualmente utilizza un logger centralizzato personalizzato e vogliamo che NServiceBus esegua il log in questo log store quando i messaggi vengono inoltrati alla coda degli errori.

Avremmo potuto ottenere ciò semplicemente modificando la configurazione di log4net se l'eccezione di NServiceBus includeva l'eccezione originale, attualmente NServiceBus registra solo un messaggio di errore generico senza dettagli su cosa ha causato l'errore.

NServiceBus ha una classe denominata NServiceBus.Faults.ErrorsNotifications che contiene i seguenti osservabili:

  • MessageSentToErrorQueue
  • MessageHasFailedAFirstLevelRetryAttempt
  • MessageHasBeenSentToSecondLevelRetries

È possibile iscriversi a questi osservabili quando il punto finale inizia, come nell'esempio seguente che registra un errore quando i messaggi sono sicuri nt alla coda di errore:

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

Il osservabile è implementato utilizzando reattivi Extensions, quindi si dovrà installare il pacchetto NuGet Rx-Core per questo lavoro.

1

C'è un'interfaccia in NServiceBus chiamato IManageMessageFailures, ma io non credo che si può utilizzare in conjucntion con il secondo livello tentativi così si sarebbe probabilmente perdere che se avete fatto andare per la propria.

È possibile scrivere gli errori su SQL Server con log4net e da lì è possibile inoltrarli ad AirBrake utilizzando l'API che contrassegna ciascun errore nella tabella degli errori come inviato in seguito, forse?

+0

Questo fa davvero schifo se non puoi usarlo con tentativi di secondo livello. Grazie comunque! –

1

Suggerisco di creare un endpoint personalizzato che si alimenta dalla coda degli errori e carica i dati su AirBrake.

Nota a margine: v4.0 | 4.1 verrà fornito con un buon Rest-Api che offre buone capacità di gestione/interrogazione per gli errori. Strumenti come Profiler e Ops useranno questa API per presentare i dati in vari modi.

http://particular.net/service-platform

+0

Questa domanda/risposta è piuttosto vecchia, ma da allora ho imparato che la ragione per cui questo non esiste come gestore globale è che ogni errore deve essere considerato nel contesto dei requisiti aziendali. –

1

Siamo passati a Serilog, ha un supporto di registrazione e registrazione perfetto per NServiceBus. Creare un sink Serilog personalizzato che invierà i tuoi eventi di log ovunque tu voglia sia abbastanza semplice.

Problemi correlati