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 
+0

请您分享您的端点配置代码吗?延迟交付与重试不同。您可以配置第一个/第二个级别的重试以及MSMQ上每次重试之间的延迟。 –

+0

新增配置。 – srisanju

从你的配置代码,我可以看到你有残疾TimeoutManager,这就是作为例如预期延迟重试不工作的原因

endpointConfiguration.DisableFeature<TimeoutManager>(); 

有什么理由呢?虽然像Azure ServiceBus/RabbitMQ这样的传输具有内置的延迟传输功能,但MSMQ不具备该功能,并且该工作由超时管理器管理。

+0

是超时管理器被禁用,因为如果启用,我无法启动nservicebus主机。它抱怨说在这个传输中不支持超时。 – srisanju

+0

由于您需要MSMQ,因此这不太合理。看到这里:https://docs.particular.net/persistence/msmq/subscription#timeouts-persistence 也许增加上述问题的例外信息,或与我们开一个支持票,所以我们可以为你看看它。 –

+0

我启用了超时管理器后编辑并添加了错误。 – srisanju