Nservicebus延迟重试,MSMQ
问题描述:
我们可以使用nservicebus和MSMQ传输启用延迟重试吗? 当我这样做时,它会发出警告并将消息移至错误队列。Nservicebus延迟重试,MSMQ
“请求的可恢复性策略DelayedRetry,但延迟传递功能在当前端点配置中不可用,请将消息移至错误队列。”
但根据nservicebus文档,它告诉如果延迟交付支持,可以执行延迟重试。而且我有以下延迟交货。
“NServiceBus提供延迟没有迟发消息传递的原生支持传输提供的功能,即对于MSMQ和SQL Server运输机。”
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"));
按照要求我已经注释掉超时管理器禁用行如下。 // endpointConfiguration.DisableFeature();
但我无法启动终端,因为我得到的错误以下。
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
答
从你的配置代码,我可以看到你有残疾TimeoutManager,这就是作为例如预期延迟重试不工作的原因
endpointConfiguration.DisableFeature<TimeoutManager>();
有什么理由呢?虽然像Azure ServiceBus/RabbitMQ这样的传输具有内置的延迟传输功能,但MSMQ不具备该功能,并且该工作由超时管理器管理。
请您分享您的端点配置代码吗?延迟交付与重试不同。您可以配置第一个/第二个级别的重试以及MSMQ上每次重试之间的延迟。 –
新增配置。 – srisanju