MSMQ中不同消息的不同重试策略

时间:2013-08-05 15:45:09

标签: message-queue msmq

我们需要一个API,它允许通过MSMQ消息队列进行异步更新,我将它放在一起,这将允许使用API​​的开发人员为每条消息指定不同的重试策略。因此,高优先级客户端系统,例如,对于销售,将在每次尝试之间提交5次传递尝试(重试)和15分钟的所有消息,而低优先级客户端系统,例如,后端邮件系统将允许用户更新他们的营销偏好,提交3次重试和每次尝试之间一小时的消息。

System.Messaging MSMQ(版本3或4)实现中是否有一种方法可以指定重试次数,重试延迟以及消息是发送到死信队列还是刚刚删除? (如果是的话,怎么样?)

如果满足这一要求,我愿意使用其他消息传递框架。

1 个答案:

答案 0 :(得分:2)

  

System.Messaging MSMQ(版本3或4)实现中是否有一种方法可以指定重试次数

根据which operating system/msmq version you're using,在WCF中指定重试语义非常复杂。以下内容适用于使用事务性队列的Windows 2008和MSMQ4。

绑定的主要设置称为MaxRetryCycles。一个重试周期是尝试从队列中成功读取消息并在处理方法内处理它。这种“尝试”实际上可以由多次尝试组成,如msmq绑定属性ReceiveRetryCount所定义。 ReceiveRetryCount是应用程序尝试读取消息并在回滚出队事务之前处理消息的次数。这标志着一个重试周期的结束。

您还可以在具有RetryCycleDelay属性的周期之间引入延迟。

更复杂的考虑是如何处理即使在多次重试周期后仍然失败的消息。

  

允许使用API​​的开发人员为每条消息指定不同的重试策略

我不知道你怎么能用MSMQ做到这一点 - 据我所知,它只能在每个端点的基础上设置重试语义。如果您正在使用事务,那么您甚至不能允许API用户设置正在发送的消息的优先级(事务队列保证按顺序传递)。

您唯一能做的就是将API的另一个实例托管为高优先级,将一个实例托管为低优先级。这些可以托管在不同的环境中,这具有额外的好处,即低优先级消息不会与具有高优先级消息的系统资源竞争。

希望这有帮助。