【问题标题】:Nservicebus delayed retry with MSMQNservicebus 延迟重试与 MSMQ
【发布时间】:2017-07-26 06:05:06
【问题描述】:

我们能否使用 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

【问题讨论】:

  • 能否分享您的端点配置代码?延迟交付与重试不同。您可以在 MSMQ 上配置第一/第二级重试和每次重试之间的延迟。
  • 添加配置。

标签: nservicebus msmq


【解决方案1】:

从您的配置代码中,我可以看到您已禁用 TimeoutManager,这就是延迟重试未按预期工作的原因,例如

endpointConfiguration.DisableFeature<TimeoutManager>();

有什么理由吗?虽然 Azure ServiceBus / RabbitMQ 等一些传输具有内置延迟交付,但 MSMQ 没有,并且该工作由超时管理器管理。

【讨论】:

  • 是的超时管理器已禁用,因为如果启用,我将无法启动 nservicebus 主机。它抱怨此传输不支持超时。
  • 这不太有意义,因为 MSMQ 需要它。请参阅此处:docs.particular.net/persistence/msmq/… 可能会将该异常消息添加到上述问题中,或者向我们打开支持票证,以便我们为您调查。
  • 我已经编辑并添加了启用超时管理器时的错误。
  • 啊,现在说得通了 :) MSMQ“持久性”只允许存储订阅信息,而超时不能存储在那里。为此,您需要完全的持久​​性。如果您在某处有数据库,建议使用 NHIbernate 或本机 SQL 持久性。
  • @srisanju 还有其他可用的持久性选项,请查看此文档页面(右侧的菜单将它们全部列出)。 docs.particular.net/transports
猜你喜欢
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多