Example #1
0
        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));
        }
Example #2
0
        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);
            }
        }