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);
}
}