2014-12-08 77 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(); 
相關問題