我收集您當前使用的TimeoutManager是2.0或2.5版本。如果是這種情況,TimeoutManager端點本身就有一個配置文件(Timeout.MessageHandlers.dll.config)和一個appSetting。
下面是一個例子:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" />
</configSections>
<MsmqTransportConfig
InputQueue="timeoutmanager"
ErrorQueue="error"
NumberOfWorkerThreads="1"
MaxRetries="5"
/>
<appSettings>
<!-- relevant for a Serialization of "xml" only -->
<add key="NameSpace" value="http://www.UdiDahan.com"/>
<!-- can be either "xml", or "binary" -->
<add key="Serialization" value="xml"/>
<!-- default is 1000, influences memory use (16 bytes/saga ID) -->
<add key="MaxSagasIdsToStore" value="10000"/>
<!-- default is 10, decreasing this value gives better time resolution but higher IO churn -->
<add key="MillisToSleepBetweenMessages" value="10"/>
</appSettings>
</configuration>
在這個版本的超時經理,你有一個選擇。您可以調整MillisToSleepBetweenMessages,並且只調整Timeout Manager處理的每條消息的Thread.Sleep()超時值。由於超時時間非常短,因爲消息放回隊列並重復處理,確實會造成大量流失。
您可以將其調整到更高的值,例如1000毫秒,但請記住,您將失去大量時間精度,特別是在發生大量超時的情況下。如果您對通過此超時管理器的所有用例的要求都是1分鐘超時,則可以採取措施,那就沒問題。
否則,你有幾種選擇:
- 看看未發行的NServiceBus 3.0代碼,其中一個顯着改善TimeoutManager正在開發中。
- 看看我的博客文章NServiceBus TimeoutManager Revisited,在那裏我實現了在生產場景中使用的Timeout Manager。請記住,它不是針對多個網站或多個時區或任何類型的問題而設計的,但它確實解決了被迫放棄準確性以減少客戶流失的問題。
感謝大衛的回答。 只是爲了澄清,如果我想使用這個TimeoutManager,我是否應該創建一個新的隊列來發送請求的所有消息爲超時並配置管理器從這個新的隊列中獲取消息? –
是的。 Timeout Manager與其他任何端點一樣是一個端點。這意味着它有一個像其他任何輸入隊列,並將創建自己的輸入隊列,如果它丟失。您只需配置您的傳奇終端(在UnicastBusConfig中)即可發送超時消息。如果你想堅持使用股票超時管理器,你可以做的一件事就是設置獨立的超時管理器,它們擁有自己的隊列,這些隊列的時間分辨率不同。在我的博客文章中開發的一個,你不需要任何這樣的事情。 –