我正在努力加速我们环境中的大量集成测试。
我现在面临的问题是,在测试之间的拆解过程中,使用msmq绑定的一个WCF服务大约需要1分钟才能关闭。
我的拆卸过程我们遍历我们的servicehosts,调用具有非常短的超时的Close()方法,覆盖WCF配置中的closeTimeout值。这适用于net.tcp绑定,但使用msmq的一个服务仍然需要1分钟才能关闭。 closeTimeout似乎没有任何效果。
对于测试服务,配置看起来像这样:
<netMsmqBinding>
<binding name="NoMSMQSecurity" closeTimeout="00:00:01" timeToLive="00:00:05"
receiveErrorHandling="Drop" maxRetryCycles="2" retryCycleDelay="00:00:01" receiveRetryCount="2">
<security mode="None" />
</binding>
</netMsmqBinding>
我使用的结束通话就像这样:
service.Close(new TimeSpan(0, 0, 0, 0, 10));
我可以采用另一种方法来更快地关闭servicehost吗?
由于这是一个自动测试,此时已成功或失败,我不想等待任何其他未经处理的消息或类似消息。
致以最诚挚的问候,
Per Salmi
答案 0 :(得分:1)
我找到了使用Msmq延迟关闭服务主机的原因。
长时间关闭的原因似乎是该服务使用另一个基于net.tcp的服务,该服务已激活reliableSession和servicehost。 reliableSession设置将非活动超时设置为5分钟,这会导致它发送保持活动的基础结构消息,它们应每2.5分钟发送一次。这种保持活跃的消息传递间隔似乎导致基于msmq的服务闲置1-2分钟,可能等待一些保持活动的消息到达。
当我将inactivityTimeout设置为5秒时,msmq服务的关闭在大约2.5秒内完成。这使自动集成测试通过更快!
答案 1 :(得分:0)
是否会有一些阻止关闭的交易。
比如说有一个打开的事务,如果你在没有提交事务的情况下关闭,那么它将等待1分钟以使事务超时,然后才能关闭。