Provides information about the fault configuration.
        public void Initialize(ReceiveComponent.Configuration receiveConfiguration, HostingComponent.Configuration hostingConfiguration, TransportSeam transportSeam)
        {
            if (receiveConfiguration.IsSendOnlyEndpoint)
            {
                //Message recoverability is only relevant for endpoints receiving messages.
                return;
            }

            hostInformation    = hostingConfiguration.HostInformation;
            this.transportSeam = transportSeam;

            transactionsOn = transportSeam.TransportDefinition.TransportTransactionMode != TransportTransactionMode.None;

            var errorQueue = settings.ErrorQueueAddress();

            transportSeam.QueueBindings.BindSending(errorQueue);

            var immediateRetryConfig = GetImmediateRetryConfig();

            var delayedRetryConfig = GetDelayedRetryConfig();

            var failedConfig = new FailedConfig(errorQueue, settings.UnrecoverableExceptions());

            recoverabilityConfig = new RecoverabilityConfig(immediateRetryConfig, delayedRetryConfig, failedConfig);

            hostingConfiguration.AddStartupDiagnosticsSection("Recoverability", new
            {
                ImmediateRetries           = recoverabilityConfig.Immediate.MaxNumberOfRetries,
                DelayedRetries             = recoverabilityConfig.Delayed.MaxNumberOfRetries,
                DelayedRetriesTimeIncrease = recoverabilityConfig.Delayed.TimeIncrease.ToString("g"),
                recoverabilityConfig.Failed.ErrorQueue,
                UnrecoverableExceptions = recoverabilityConfig.Failed.UnrecoverableExceptionTypes.Select(t => t.FullName).ToArray()
            });
        }
Exemple #2
0
        public void Initialize(ReceiveConfiguration receiveConfiguration)
        {
            if (settings.GetOrDefault <bool>("Endpoint.SendOnly"))
            {
                //Message recoverability is only relevant for endpoints receiving messages.
                return;
            }

            transactionsOn = receiveConfiguration.TransactionMode != TransportTransactionMode.None;

            var errorQueue = settings.ErrorQueueAddress();

            settings.Get <QueueBindings>().BindSending(errorQueue);

            var delayedRetryConfig = GetDelayedRetryConfig();

            var immediateRetryConfig = GetImmediateRetryConfig();

            var failedConfig = new FailedConfig(errorQueue, settings.UnrecoverableExceptions());

            recoverabilityConfig = new RecoverabilityConfig(immediateRetryConfig, delayedRetryConfig, failedConfig);

            settings.AddStartupDiagnosticsSection("Recoverability", new
            {
                ImmediateRetries           = recoverabilityConfig.Immediate.MaxNumberOfRetries,
                DelayedRetries             = recoverabilityConfig.Delayed.MaxNumberOfRetries,
                DelayedRetriesTimeIncrease = recoverabilityConfig.Delayed.TimeIncrease.ToString("g"),
                recoverabilityConfig.Failed.ErrorQueue,
                UnrecoverableExceptions = recoverabilityConfig.Failed.UnrecoverableExceptionTypes.Select(t => t.FullName).ToArray()
            });

            WireUpLegacyNotifications();
        }
Exemple #3
0
        protected internal override void Setup(FeatureConfigurationContext context)
        {
            var errorQueue = context.Settings.ErrorQueueAddress();

            context.Settings.Get <QueueBindings>().BindSending(errorQueue);

            context.Container.ConfigureComponent(b =>
            {
                Func <string, MoveToErrorsExecutor> moveToErrorsExecutorFactory = localAddress =>
                {
                    var hostInfo            = b.Build <HostInformation>();
                    var staticFaultMetadata = new Dictionary <string, string>
                    {
                        { FaultsHeaderKeys.FailedQ, localAddress },
                        { Headers.ProcessingMachine, RuntimeEnvironment.MachineName },
                        { Headers.ProcessingEndpoint, context.Settings.EndpointName() },
                        { Headers.HostId, hostInfo.HostId.ToString("N") },
                        { Headers.HostDisplayName, hostInfo.DisplayName }
                    };

                    var headerCustomizations = context.Settings.Get <Action <Dictionary <string, string> > >(FaultHeaderCustomization);

                    return(new MoveToErrorsExecutor(b.Build <IDispatchMessages>(), staticFaultMetadata, headerCustomizations));
                };

                var transactionsOn          = context.Settings.GetRequiredTransactionModeForReceives() != TransportTransactionMode.None;
                var delayedRetryConfig      = GetDelayedRetryConfig(context.Settings, transactionsOn);
                var delayedRetriesAvailable = transactionsOn &&
                                              (context.Settings.DoesTransportSupportConstraint <DelayedDeliveryConstraint>() || context.Settings.Get <TimeoutManagerAddressConfiguration>().TransportAddress != null);

                Func <string, DelayedRetryExecutor> delayedRetryExecutorFactory = localAddress =>
                {
                    if (delayedRetriesAvailable)
                    {
                        return(new DelayedRetryExecutor(
                                   localAddress,
                                   b.Build <IDispatchMessages>(),
                                   context.Settings.DoesTransportSupportConstraint <DelayedDeliveryConstraint>()
                                ? null
                                : context.Settings.Get <TimeoutManagerAddressConfiguration>().TransportAddress));
                    }

                    return(null);
                };

                var immediateRetryConfig      = GetImmediateRetryConfig(context.Settings, transactionsOn);
                var immediateRetriesAvailable = transactionsOn;

                Func <RecoverabilityConfig, ErrorContext, RecoverabilityAction> policy;
                if (!context.Settings.TryGet(PolicyOverride, out policy))
                {
                    policy = DefaultRecoverabilityPolicy.Invoke;
                }

                var failedConfig = new FailedConfig(errorQueue, context.Settings.UnrecoverableExceptions());

                return(new RecoverabilityExecutorFactory(
                           policy,
                           new RecoverabilityConfig(immediateRetryConfig, delayedRetryConfig, failedConfig),
                           delayedRetryExecutorFactory,
                           moveToErrorsExecutorFactory,
                           immediateRetriesAvailable,
                           delayedRetriesAvailable));
            }, DependencyLifecycle.SingleInstance);

            RaiseLegacyNotifications(context);

            //HINT: we turn off the legacy retries satellite only when explicitly configured by the user
            bool disableLegacyRetriesSatellite;

            if (context.Settings.TryGet(DisableLegacyRetriesSatellite, out disableLegacyRetriesSatellite) == false)
            {
                SetupLegacyRetriesSatellite(context);
            }
        }
Exemple #4
0
        protected internal override void Setup(FeatureConfigurationContext context)
        {
            var errorQueue = context.Settings.ErrorQueueAddress();

            context.Settings.Get <QueueBindings>().BindSending(errorQueue);

            var transactionsOn          = context.Receiving.TransactionMode != TransportTransactionMode.None;
            var delayedRetryConfig      = GetDelayedRetryConfig(context.Settings, transactionsOn);
            var delayedRetriesAvailable = transactionsOn &&
                                          (context.Settings.DoesTransportSupportConstraint <DelayedDeliveryConstraint>() || context.Settings.Get <TimeoutManagerAddressConfiguration>().TransportAddress != null);


            var immediateRetryConfig      = GetImmediateRetryConfig(context.Settings, transactionsOn);
            var immediateRetriesAvailable = transactionsOn;

            var failedConfig = new FailedConfig(errorQueue, context.Settings.UnrecoverableExceptions());

            var recoverabilityConfig = new RecoverabilityConfig(immediateRetryConfig, delayedRetryConfig, failedConfig);

            context.Settings.AddStartupDiagnosticsSection("Recoverability", new
            {
                ImmediateRetries           = recoverabilityConfig.Immediate.MaxNumberOfRetries,
                DelayedRetries             = recoverabilityConfig.Delayed.MaxNumberOfRetries,
                DelayedRetriesTimeIncrease = recoverabilityConfig.Delayed.TimeIncrease.ToString("g"),
                recoverabilityConfig.Failed.ErrorQueue,
                UnrecoverableExceptions = recoverabilityConfig.Failed.UnrecoverableExceptionTypes.Select(t => t.FullName).ToArray()
            });

            context.Container.ConfigureComponent(b =>
            {
                Func <string, MoveToErrorsExecutor> moveToErrorsExecutorFactory = localAddress =>
                {
                    var hostInfo            = b.Build <HostInformation>();
                    var staticFaultMetadata = new Dictionary <string, string>
                    {
                        { FaultsHeaderKeys.FailedQ, localAddress },
                        { Headers.ProcessingMachine, RuntimeEnvironment.MachineName },
                        { Headers.ProcessingEndpoint, context.Settings.EndpointName() },
                        { Headers.HostId, hostInfo.HostId.ToString("N") },
                        { Headers.HostDisplayName, hostInfo.DisplayName }
                    };

                    var headerCustomizations = context.Settings.Get <Action <Dictionary <string, string> > >(FaultHeaderCustomization);

                    return(new MoveToErrorsExecutor(b.Build <IDispatchMessages>(), staticFaultMetadata, headerCustomizations));
                };

                Func <string, DelayedRetryExecutor> delayedRetryExecutorFactory = localAddress =>
                {
                    if (delayedRetriesAvailable)
                    {
                        return(new DelayedRetryExecutor(
                                   localAddress,
                                   b.Build <IDispatchMessages>(),
                                   context.Settings.DoesTransportSupportConstraint <DelayedDeliveryConstraint>()
                                ? null
                                : context.Settings.Get <TimeoutManagerAddressConfiguration>().TransportAddress));
                    }

                    return(null);
                };

                if (!context.Settings.TryGet(PolicyOverride, out Func <RecoverabilityConfig, ErrorContext, RecoverabilityAction> policy))
                {
                    policy = DefaultRecoverabilityPolicy.Invoke;
                }

                return(new RecoverabilityExecutorFactory(
                           policy,
                           recoverabilityConfig,
                           delayedRetryExecutorFactory,
                           moveToErrorsExecutorFactory,
                           immediateRetriesAvailable,
                           delayedRetriesAvailable));
            }, DependencyLifecycle.SingleInstance);

            RaiseLegacyNotifications(context);
        }