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