1
votes

Can we enable delayed retries with nservicebus and MSMQ transport. When i do it it will throw a warning and move the message to error queue.

"Recoverability policy requested DelayedRetry however delayed delivery capability is not available with the current endpoint configuration. Moving message to error queue instead."

But according to nservicebus documentation it tells delayed retry can be performed if delayed delivery is supported. And i have below about delayed delivery.

"NServiceBus provides delayed deliver feature for transports that don't have native support for delayed message delivery, i.e. for MSMQ and SQL Server transports. "

 endpointConfiguration.SendFailedMessagesTo("error");
        endpointConfiguration.AuditProcessedMessagesTo("audit");
        endpointConfiguration.DisableFeature<TimeoutManager>();
        var messageProcessingConcurrency = ConfigurationManager.AppSettings["NservicebusMessageProcessingConcurrency"];
        endpointConfiguration.LimitMessageProcessingConcurrencyTo(int.Parse(messageProcessingConcurrency));
        //configuring delayed retries
        var recoverability = endpointConfiguration.Recoverability();
        //recoverability.CustomPolicy(OrderRecoverability.CustomRetryPolicy);
        recoverability.Delayed(
            delayed =>
            {
                delayed.NumberOfRetries(2);
                delayed.TimeIncrease(TimeSpan.FromMinutes(30));
            });
        //no imediate retries
        recoverability.Immediate(
            immediate =>
            {
                immediate.NumberOfRetries(0);
            });
        endpointConfiguration.UsePersistence<MsmqPersistence>();
        var transport = endpointConfiguration.UseTransport<MsmqTransport>();
        transport.Transactions(TransportTransactionMode.SendsAtomicWithReceive);
        var conventions = endpointConfiguration.Conventions();
        conventions
            .DefiningEventsAs(
                t =>
                    t.Namespace != null
                    && t.Namespace.StartsWith("Dodo.Fibre.Provisioning.Messages"));

As requested i have commented out the timeout manager disable line as below. // endpointConfiguration.DisableFeature();

But i can not start endpoint as i am getting below error.

2017-08-01 08:45:28.074 FATAL NServiceBus.Hosting.Windows.WindowsHost Start fail
ure
System.Exception: The selected persistence doesn't have support for timeout stor
age. Select another persistence or disable the timeout manager feature using end
pointConfiguration.DisableFeature<TimeoutManager>()
   at NServiceBus.Features.TimeoutManager.Setup(FeatureConfigurationContext cont
ext) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\DelayedDelivery
\TimeoutManager\TimeoutManager.cs:line 34
   at NServiceBus.Features.FeatureActivator.ActivateFeature(FeatureInfo featureI
nfo, List`1 featuresToActivate, IConfigureComponents container, PipelineSettings
 pipelineSettings, RoutingComponent routing) in C:\BuildAgent\work\3206e2123f54f
ce4\src\NServiceBus.Core\Features\FeatureActivator.cs:line 194
   at NServiceBus.Features.FeatureActivator.SetupFeatures(IConfigureComponents c
ontainer, PipelineSettings pipelineSettings, RoutingComponent routing) in C:\Bui
ldAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Features\FeatureActivator.cs:
line 57
   at NServiceBus.InitializableEndpoint.<Initialize>d__1.MoveNext() in C:\BuildA
gent\work\3206e2123f54fce4\src\NServiceBus.Core\InitializableEndpoint.cs:line 60
1
Could you please share your endpoint configuration code? Delayed delivery is not the same as retries. You can configure the first/second level retries and the delay between each retry on MSMQ.Hadi Eskandari
Added configurations.srisanju

1 Answers

0
votes

From your configuration code I can see that you have disabled TimeoutManager and that's the reason the delayed retries are not working as expected e.g.

endpointConfiguration.DisableFeature<TimeoutManager>();

Any reason for that? While some transport like Azure ServiceBus / RabbitMQ have built-in delayed-delivery, MSMQ does not have that and that work is managed by the timeout manager.