MSMQ WCF重试消息块

时间:2014-05-20 12:22:27

标签: c# wcf msmq netmsmqbinding

我们使用MSMQ对发送到Windows Server 2012上运行的内部服务总线的消息进行事务处理,并在消息处理失败时遇到问题。

设置服务

服务

<endpoint address="net.msmq://localhost/private/quoteandbuy_transactions" binding="netMsmqBinding" bindingConfiguration="MsmqQuoteAndBuy" name="Msmq" contract="Soa.Net.EndPoints.IMessagingXmlProcessor" />

结合

<binding name="MsmqQuoteAndBuy" durable="true" exactlyOnce="true" maxRetryCycles="100" receiveErrorHandling="Move" receiveRetryCount="0" retryCycleDelay="01:00:00" useMsmqTracing="true"  maxReceivedMessageSize="2147483647">
  <readerQuotas maxStringContentLength="2147483647" />
  <security mode="None">
    <transport msmqAuthenticationMode="None" msmqProtectionLevel="None" />
    <message clientCredentialType="None" />
  </security>
</binding>

正如您所看到的,我们每隔1小时运行一次循环,每条消息的重试次数限制为100次。默认情况下不会实现此功能,因为邮件的TTL为24小时(默认值)。

我们在MSMQ中的交易由于第三方正在进行而导致失败。消息将被丢弃到重试子队列中。还有一些进来,同样的事情发生了。比如说我们现在有20次失败。

因为它目前只有第一条消息(有时也是第二条消息?)将被重试,这很可能会有相同的失败过程,所以我们再次不提交事务。

我希望所有已达到重试周期时间跨度的消息都被移动到主队列再次尝试,但这不会发生。顶部消息将继续阻塞,直到达到TTL或最终成功。

设置队列行为的方法是不阻止和处理已经达到重试时间跨度的所有消息。

我们处于这样一种情况:如果在10分钟内收到20条消息,如果它们全部失败,则每小时只重试第一条消息,另一条消息19坐在那里直到第一条消息到达TTL然后得到尝试,因为他们已经到达那里TTL他们也被从重试队列中删除。

据我所知,消息传递在FIFO基础上工作,而在Vista上的MSMQ之前,消息失败会阻止其他消息,因此重试消息队列。但是,这不是刚刚将问题转移到重试子队列吗?

0 个答案:

没有答案