2013-04-17 7 views
5

current advice on handling exceptions in NServiceBus निर्मित सुविधाओं का उपयोग करना है। त्रुटिपूर्ण संदेश त्रुटि संदेश कतार में जाते हैं, और डिस्क पर एक लॉग लिखा जाता है।क्या NServiceBus के लिए कोई वैश्विक अपवाद हैंडलर है?

लेकिन अगर मैं एयरब्रेक जैसी किसी सेवा में अपनी त्रुटियां भेजना चाहता हूं जिसमें समान अपवाद, मीट्रिक और अन्य अच्छी सामग्री को समूहबद्ध करने के लिए बेहतर कार्यक्षमता है? क्या कोई वैश्विक अपवाद हैंडलर मैं टैप कर सकता हूं?

उत्तर

4

मूल पोस्ट में उल्लेख किया सिफारिश समाधान के रूप में त्रुटियों की निगरानी के लिए ServicePulse उपयोग करने के लिए है। जिस क्लाइंट के लिए मैं वर्तमान में काम करता हूं वह एक कस्टम बनाया गया केंद्रीकृत लॉगर का उपयोग कर रहा है, और हम एनएस सर्विसबस को इस लॉग स्टोर में लॉग इन करना चाहते हैं जब संदेशों को त्रुटि कतार में अग्रेषित किया जाता है।

अगर हम NServiceBus के अपवाद को मूल अपवाद शामिल करते हैं तो हम लॉग 4नेट कॉन्फ़िगरेशन को संपादित करके इसे हासिल कर सकते थे, वर्तमान में NServiceBus केवल एक सामान्य त्रुटि संदेश लॉग करता है जिसमें विफलता के कारण के बारे में कोई विवरण नहीं है।

NServiceBus एक वर्ग नामित NServiceBus.Faults.ErrorsNotifications जो निम्नलिखित observables शामिल है:

  • MessageSentToErrorQueue
  • MessageHasFailedAFirstLevelRetryAttempt
  • MessageHasBeenSentToSecondLevelRetries

आप इन observables की सदस्यता ले सकते जब endpoint शुरू होता है, जैसा कि निम्न उदाहरण में है जो संदेशों से होने पर त्रुटि लॉग करता है NT त्रुटि कतार में:

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

नमूदार रिएक्टिव एक्सटेंशन का उपयोग द्वारा कार्यान्वित किया जाता है, तो आप NuGet पैकेज आरएक्स कोर स्थापित करने के लिए यह काम करने के लिए होगा।

1

NServiceBus में एक अंतरफलक है IManageMessageFailures कहा जाता है, लेकिन मैं नहीं मानता कि आप दूसरे स्तर पुनर्प्रयास साथ conjucntion में उपयोग कर सकते हैं तो आप शायद खो देगा कि अगर तुमने किया था अपनी खुद के लिए जाते हैं।

आप लॉग 4नेट के साथ SQL सर्वर में त्रुटियों को लिख सकते हैं और वहां से आप उन्हें अपने एपीआई का उपयोग करके एररबैक में अग्रेषित कर सकते हैं त्रुटि त्रुटि में प्रत्येक त्रुटि को बाद में भेजा जा सकता है?

+0

यह वास्तव में बेकार है अगर आप इसे दूसरे स्तर की रीट्रीज़ के साथ उपयोग नहीं कर सकते हैं। हालांकि धन्यवाद! –

1

मैं सुझाव दूंगा कि आप एक कस्टम एंडपॉइंट बनाएं जो त्रुटि कतार को खिलाता है और डेटा को एयरब्रैक में अपलोड करता है।

साइड नोट: v4.0 | 4.1 एक अच्छा रेस्ट-एपी के साथ आएगा जो आपको त्रुटियों के लिए अच्छी प्रबंधन/क्वेरीिंग क्षमताओं देता है। प्रोफाइलर और ओपीएस जैसे टूल्स इस एपीआई का उपयोग विभिन्न तरीकों से आपको डेटा पेश करने के लिए करेंगे।

http://particular.net/service-platform

+0

यह प्रश्न/उत्तर थोडा पुराना है, लेकिन मैंने तब से सीखा है कि वैश्विक ग्लोबलर के रूप में यह अस्तित्व में नहीं है क्योंकि प्रत्येक विफलता को व्यावसायिक आवश्यकताओं के संदर्भ में माना जाना चाहिए। –

1

हमने सेरिलोग में स्विच किया, इसके पास NServiceBus के लिए सही लॉगिंग ans tracing समर्थन है। एक कस्टम सेरिलोग सिंक बनाना जो आपके लॉग इवेंट भेज देगा जहां भी आप चाहते हैं काफी आसान है।

संबंधित मुद्दे