NServiceBus.Recoverability.Setup C# (CSharp) Method

Setup() protected method

protected Setup ( FeatureConfigurationContext context ) : void
context FeatureConfigurationContext
return void
        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;
                }

                return new RecoverabilityExecutorFactory(
                    policy,
                    new RecoverabilityConfig(immediateRetryConfig, delayedRetryConfig, new FailedConfig(errorQueue)),
                    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);
            }
        }