2014-12-08 55 views
3

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

我只希望消息被重试,如果它真的失败(即引发异常),而不仅仅是因为它超过一分钟。

这是行为吗?它可以关闭吗? “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 
+0

看看端点日志,有一个正在发生的事情是,交易超时的可能性(默认的超时时间为1分钟)没有一异常基本上被抛出并重试消息。 – 2014-12-09 11:33:44

+0

我在日志中看到的所有行为都是流水线行为链,就像收到一条新消息一样。事务超时无关。 – zeroid 2014-12-09 17:14:39

回答

1

毛罗是在正确的轨道上,但日志没有表现得很好。我们使用SQL服务器来处理消息队列。默认情况下,事务将在60秒后超时,但超时不会立即导致任何错误。只有当消息处理完成时,NServiceBus才会尝试更新/移动已完成的消息,但它不会因为事务不再有效(随后会抛出异常)。

只有60秒后第二个处理程序启动的原因是因为启用了并发处理,并且一旦第一个处理程序的事务超时,该消息就可以有效地用于另一个线程提取(直到该点锁定)。

所以解决的办法就是在增加配置是这样的:

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

(据推测,如果你正在使用MSMQ作为消息传输,不同的超时可以申请...)

+0

哇!你在我的一小时内得到了你自己的答案! (:但是看看我对机器配置的评论,所以你不会意外地陷入(几乎)同样的陷阱! – Reyhn 2014-12-16 15:05:33

1

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

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

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

或者,您可以使用的app.config改变:

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

但是,这里有一个警告。默认系统超时仍然设置为10分钟! 如果你知道你将有交易持续超过10分钟,则需要以下内容添加到您的的machine.config

<configuration> 
    <system.transactions> 
    <machineSettings maxTimeout="01:00:00" /> 
    </system.transactions> 
</configuration> 

的机器。配置位于

%windir%\Microsoft.NET\Framework64\[version]\config\machine.config 

参考文献:

DTC troubles with long running transactions in NServiceBus

Override the System.Transactions default timeout of 10 minutes in the code

Where is my machine.config?

+0

如果有人知道如何让NServiceBus **不**隐藏这个错误,请离开一个评论。起初有一个问题的事实不是很明显。 – Reyhn 2014-12-16 15:06:46

0

对于那些谁根本不想NServiceBus惹交易的东西左右(又名获得关我交易方式,伙计)一个可以简单地NSB停止交易范围管理处理程序:

//e.g. When using the BusConfiguration object: 
config.Transactions() 
    .DoNotWrapHandlersExecutionInATransactionScope(); 
相关问题