Thursday, February 21, 2013
NServiceBus Hands on Labs
Please check out the new HOL on the NSB site.
Tuesday, February 12, 2013
NSB Custom Fault Handling in 15 Minutes
We had a need to divert some of our exceptions over to a level 2 help desk. The help desk would then either fix the problem on behalf of the customer or initiate contact with the customer to fix the problem. We implemented a custom fault handler and it really only took 15 minutes.
You must be aware that when you take control of the faults, it is up to you to handle all scenarios and in fact SLRs will not work. In our case, that doesn't really matter since the majority of our exceptions will be handled by a person with this new process.
First we started out by adding some custom config to wire up the handler. We wanted to maintain the existing process for exceptions that the help desk would not handle, so we borrowed the code from the forwarding handler.
Now we can just simply add that to our endpoint config.
Lastly, all we need to do is implement the interface and decide base on the exception where it should end up. With this, we are DONE!
You must be aware that when you take control of the faults, it is up to you to handle all scenarios and in fact SLRs will not work. In our case, that doesn't really matter since the majority of our exceptions will be handled by a person with this new process.
First we started out by adding some custom config to wire up the handler. We wanted to maintain the existing process for exceptions that the help desk would not handle, so we borrowed the code from the forwarding handler.
public static Configure ForwardToHelpDeskInCaseOfFault(this Configure config) { ....//left out for brevity config.Configurer.ConfigureComponent<HelpDeskFaultHandler>(DependencyLifecycle.InstancePerCall) .ConfigureProperty(fm => fm.ErrorQueue, ErrorQueue); return config; }
Now we can just simply add that to our endpoint config.
.ForwardToHelpDeskInCaseOfFault();
Lastly, all we need to do is implement the interface and decide base on the exception where it should end up. With this, we are DONE!
public class HelpDeskFaultHandler : IManageMessageFailures { private Address localAddress; private static readonly ILog Logger = LogManager.GetLogger("WebGateway.HelpDeskFaultHandler"); public Address ErrorQueue { get; set; } public void Init(Address address) { this.localAddress = address; } public void ProcessingAlwaysFailsForMessage(TransportMessage message, Exception e) { this.SendToHelpDesk(message, e, "ProcessingFailed"); } public void SerializationFailedForMessage(TransportMessage message, Exception e) { this.SendToErrorQueue(message, e, "SerializationFailed"); } private void SendToErrorQueue(TransportMessage message, Exception e, String reason) { ...//left out for brevity } private void SendToHelpDesk(TransportMessage message, Exception e, String reason) { if ( e.GetType().IsAssignableFrom(typeof(MyCustomException))) { try { HelpDeskException hd = new HelpDeskException(message, e.Message); hd.Save(); } catch (Exception ex) { Logger.Warn("Failed to send to help desk, sending to error queue", ex); this.SendToErrorQueue(message, e, "SendToHelpDeskFailed"); } } else { this.SendToErrorQueue(message, e, reason); } } private void SetExceptionHeaders(TransportMessage message, Exception e, String reason) { ...//left out for brevity } }
Subscribe to:
Posts (Atom)