2013-04-17 31 views
5

current advice on handling exceptions in NServiceBus là sử dụng các tiện ích tích hợp sẵn. Các thông báo bị xóa đi vào hàng đợi thông báo lỗi và nhật ký được ghi vào đĩa.Có một trình xử lý ngoại lệ toàn cục cho NServiceBus không?

Nhưng nếu tôi muốn gửi lỗi của mình đến một dịch vụ như AirBrake có chức năng tốt hơn để nhóm các ngoại lệ, số liệu và các nội dung hay khác tương tự? Có một trình xử lý ngoại lệ toàn cục mà tôi có thể khai thác không?

Trả lời

4

Như đã đề cập trong các bài bản gốc các giải pháp được đề nghị là sử dụng ServicePulse để theo dõi lỗi. Ứng dụng khách hiện tôi đang làm là sử dụng trình ghi tập trung tùy chỉnh được thực hiện và chúng tôi muốn NServiceBus đăng nhập vào cửa sổ nhật ký này khi các thư được chuyển tiếp đến hàng đợi lỗi. Chúng tôi có thể đạt được điều này bằng cách chỉnh sửa cấu hình log4net nếu ngoại lệ từ NServiceBus đã bao gồm ngoại lệ ban đầu, hiện tại NServiceBus chỉ ghi nhật ký thông báo lỗi chung mà không có chi tiết về nguyên nhân gây ra lỗi.

NServiceBus có một lớp có tên NServiceBus.Faults.ErrorsNotifications chứa các quan sát sau:

  • MessageSentToErrorQueue
  • MessageHasFailedAFirstLevelRetryAttempt
  • MessageHasBeenSentToSecondLevelRetries

Bạn có thể đăng ký vào những quan sát khi thiết bị đầu cuối bắt đầu, như trong ví dụ sau đây ghi nhật ký lỗi khi thư nt vào hàng đợi lỗi:

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

Quan sát được thực hiện bằng cách sử dụng Tiện ích mở rộng phản ứng, vì vậy bạn sẽ phải cài đặt gói RG-Core NuGet để hoạt động.

1

Có một giao diện trong NServiceBus gọi IManageMessageFailures, nhưng tôi không tin rằng bạn có thể sử dụng nó trong conjucntion với Cấp Retry Thứ hai, do đó bạn có lẽ sẽ mất rằng nếu bạn đã đi cho riêng bạn.

Bạn có thể ghi lỗi cho SQL Server bằng log4net và từ đó bạn có thể chuyển tiếp chúng tới AirBrake bằng cách sử dụng API đánh dấu từng lỗi trong bảng lỗi như được gửi sau đó?

+0

Điều đó thật sự rất tệ nếu bạn không thể sử dụng nó với lần thử lại ở cấp độ hai. Cảm ơn, mặc dù! –

1

Tôi khuyên bạn nên tạo điểm cuối tùy chỉnh cung cấp hàng đợi lỗi và tải dữ liệu lên AirBrake.

Lưu ý bên: v4.0 | 4.1 sẽ có phần mềm Rest-Api tuyệt vời cung cấp cho bạn khả năng quản lý/truy vấn tốt đẹp cho các lỗi. Các công cụ như Profiler và Ops sẽ sử dụng api này để trình bày dữ liệu cho bạn theo nhiều cách khác nhau.

http://particular.net/service-platform

+0

Câu hỏi/câu trả lời này khá cũ, nhưng tôi đã học được rằng lý do này không tồn tại như một trình xử lý toàn cầu là vì mỗi lỗi nên được xem xét trong bối cảnh yêu cầu kinh doanh. –

1

Chúng tôi đã chuyển sang Serilog, nó có hỗ trợ ghi nhật ký hoàn hảo hỗ trợ tìm kiếm NServiceBus. Tạo một bồn rửa Serilog tùy chỉnh sẽ gửi các sự kiện đăng nhập của bạn bất cứ nơi nào bạn muốn là khá dễ dàng.

Các vấn đề liên quan