我是C#的新手,我正在一个正在使用NServiceBus Saga的项目中工作。
在saga的逻辑内部,如果没有达到条件,则会调用RequestTimeout方法1分钟。
问题是这个调用消耗了太多的处理器,我认为这是因为TimeoutManager使用10毫秒的默认值来检查时间是否结束并将超时消息发送回传奇。
有人知道如何更改此millisToSleepBetweenMessages属性吗?
提前致谢!西巴
答案 0 :(得分:1)
我收集您当前使用的TimeoutManager是2.0或2.5版本。如果是这种情况,TimeoutManager端点本身就有一个带有appSetting的配置文件(Timeout.MessageHandlers.dll.config)。
以下是一个例子:
<?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>
在此版本的Timeout Manager中,您可以选择。您可以调整MillisToSleepBetweenMessages,只调整Timeout Manager处理的每条消息上的Thread.Sleep()超时。由于超时非常小,这会导致大量流失,因为消息会被重新放回队列并反复重新处理。
您可以将其调整为更高的1000毫秒,但请记住,您将失去大量的时间准确性,尤其是在有很多超时的情况下。如果您对通过此超时管理器的所有用例的要求是1分钟超时,则给予或接受,那就没关系。
否则,你有几个选择: