如何停止NServiceBus重试尚未';你没有抛出异常吗?

如何停止NServiceBus重试尚未';你没有抛出异常吗?,nservicebus,Nservicebus,我遇到了与重试相关的行为,在我尝试过的文档或搜索中找不到任何引用。本质上,如果我的处理程序处理一条消息的时间超过60秒(请注意,它不会引发异常),NServiceBus会触发另一个处理程序来处理同一条消息。这意味着处理程序完成的工作至少运行两次(通常是5次,因为我将MaxRetries配置为5) 我只希望在消息确实失败(即引发异常)时重试消息,而不仅仅是因为它需要一分钟以上的时间 这种行为符合设计要求吗?可以关掉吗?“60秒”是否可配置 在日志中,它看起来就像一条正在处理的新消息: 2014-1

我遇到了与重试相关的行为,在我尝试过的文档或搜索中找不到任何引用。本质上,如果我的处理程序处理一条消息的时间超过60秒(请注意,它不会引发异常),NServiceBus会触发另一个处理程序来处理同一条消息。这意味着处理程序完成的工作至少运行两次(通常是5次,因为我将MaxRetries配置为5)

我只希望在消息确实失败(即引发异常)时重试消息,而不仅仅是因为它需要一分钟以上的时间

这种行为符合设计要求吗?可以关掉吗?“60秒”是否可配置

在日志中,它看起来就像一条正在处理的新消息:

2014-12-09 14:50:38,406 [13] DEBUG NServiceBus.Pipeline.BehaviorChain`1 - ChildContainerBehavior
2014-12-09 14:50:38,422 [13] DEBUG NServiceBus.Pipeline.BehaviorChain`1 - MessageHandlingLoggingBehavior
2014-12-09 14:50:38,430 [13] DEBUG NServiceBus.Unicast.Behaviors.MessageHandlingLoggingBehavior - Received message with ID 031e6070-4397-4e55-8670-a3fc00f49d7c from sender Foo
2014-12-09 14:50:38,440 [13] DEBUG NServiceBus.Pipeline.BehaviorChain`1 - ImpersonateSenderBehavior
...
2014-12-09 14:50:40,313 [13] DEBUG NServiceBus.Pipeline.BehaviorChain`1 - InvokeHandlersBehavior
2014-12-09 14:50:40,319 [13] INFO  MyHandler - Running
...
...
2014-12-09 14:51:38,642 [15] DEBUG NServiceBus.Pipeline.BehaviorChain`1 - ChildContainerBehavior
2014-12-09 14:51:38,667 [15] DEBUG NServiceBus.Pipeline.BehaviorChain`1 - MessageHandlingLoggingBehavior
2014-12-09 14:51:38,678 [15] DEBUG NServiceBus.Unicast.Behaviors.MessageHandlingLoggingBehavior - Received message with ID 031e6070-4397-4e55-8670-a3fc00f49d7c from sender Foo
2014-12-09 14:51:38,686 [15] DEBUG NServiceBus.Pipeline.BehaviorChain`1 - ImpersonateSenderBehavior
...
2014-12-09 14:51:38,831 [15] DEBUG NServiceBus.Pipeline.BehaviorChain`1 - InvokeHandlersBehavior
2014-12-09 14:51:38,837 [15] INFO  MyHandler - Running

毛罗走的是正确的道路,但日志并没有很好地显示这一点。我们正在将SQL server用于消息队列。默认情况下,事务将在60秒后超时,但超时不会立即导致任何错误。只有当消息处理完成时,NServiceBus才会尝试更新/移动已完成的消息,但由于事务不再有效,它无法更新/移动已完成的消息(然后引发异常)

第二个处理程序仅在60秒后启动的原因是启用了并发处理,并且一旦第一个处理程序的事务超时,消息就可以有效地供另一个线程拾取(直到此时为止其已锁定)

因此,解决方案是在配置中添加如下内容:

  <system.transactions>
    <defaultSettings timeout="00:10:00" />
  </system.transactions>


(如果您使用MSMQ作为消息传输,可能会应用不同的超时…

我有完全相同的症状,问题是通过DTC(分布式事务)的长时间运行事务

正如Mauro所建议的,DTC的默认超时时间为60秒。 这可以在系统上进行更改:

启动“组件服务”,然后展开“组件服务->计算机->我的计算机”,右键单击并选择属性。在“选项”选项卡上,可以设置所需的默认超时

或者,您可以使用app.config更改它:

<configuration>
  <system.transactions>
    <defaultSettings timeout="00:10:00"/>
  </system.transactions>
</configuration>
<configuration>
  <system.transactions>
    <machineSettings maxTimeout="01:00:00" />
  </system.transactions>
</configuration>
参考资料:


对于那些不想让NServiceBus处理事务的人(也就是说,别管我的事务了,伙计),可以简单地让NSB停止管理事务范围内的处理程序:

//例如,当使用BusConfiguration对象时:
config.Transactions()
.DonotwraphandlerExecutionInTransactionScope();

看一看端点日志,可能发生的情况是事务超时(默认超时为1分钟)确实发生异常,异常基本上是在后台抛出的,消息会重试。我在日志中看到的(我在上面添加的)是运行所有行为的管道行为链,好像收到了一条新消息。没有关于事务超时的信息。哇!你比我早一个小时就得到了自己的答案!(:但是请看一看我关于机器配置的评论,这样你就不会意外地再次落入(几乎)相同的陷阱!如果有人知道如何让NServiceBus不隐藏此错误,请留下评论。一开始问题并不明显。
%windir%\Microsoft.NET\Framework64\[version]\config\machine.config