static RecoverabilityAction OrderPlacedPolicy(RecoverabilityConfig config, ErrorContext context) { var errorCategory = ErrorCategory.Unknown; if (context.Message.Headers.ContainsKey("NServiceBus.EnclosedMessageTypes")) { if (context.Message.Headers["NServiceBus.EnclosedMessageTypes"].StartsWith("Messages.Commands.PlaceOrder")) { errorCategory = FailPolicy.GetPolicy("Messages.Commands.PlaceOrder").GetCategory(context.Exception); } else if (context.Message.Headers["NServiceBus.EnclosedMessageTypes"].StartsWith("Messages.Commands.CancelOrder")) { errorCategory = FailPolicy.GetPolicy("Messages.Commands.CancelOrder").GetCategory(context.Exception); } } if (errorCategory == ErrorCategory.Persistent) { return(RecoverabilityAction.MoveToError(config.Failed.ErrorQueue)); } else if (errorCategory == ErrorCategory.SemiTransient) { return(RecoverabilityAction.DelayedRetry(TimeSpan.FromSeconds(60))); } // invocation of default recoverability policy return(DefaultRecoverabilityPolicy.Invoke(config, context)); }
static void SetUpPolicies() { FailPolicy.CreatePolicyWithName("Messages.Commands.PlaceOrder") .PersistentByDefault() .ClassifyAsSemiTransient <FraudDetectionUnavailableException>() .AddTransientClassifier(new SqlErrorClassifier()); FailPolicy.CreatePolicyWithName("Messages.Commands.CancelOrder") .TransientByDefault() .ClassifyAsPersistent <OrderNotFoundException>(); }
protected override void OnStart(string[] args) { try { FailPolicy.CreateFor(typeof(CrmNotifierRequest)) .ClassifyAsTransient(new SqlTransientErrorDetector()) .OnTransientError(retryLimit: 3, retryPeriod: TimeSpan.FromMinutes(1), periodType: PeriodType.ExponentialBackoff, exponent: 2, retryLimitAction: FailAction.SendToFailExchange) .OnPersistentError(FailAction.SendToFailExchange); Endpoint.InitializeAsConsumer(_endpointManager) .HandleEvent <CrmNotifierRequest>() .WithSingleConsumer(perConsumerConcurrency: 1) .Start(); } catch (Exception ex) { Trace.TraceError("Could not start windows service: " + ex); } }