在MSMQ中查找旧消息

时间:2011-01-26 12:32:52

标签: .net msmq

我这个场景有两个队列。 “错误”和“MyQueue”。

邮件被转储到MyQueue并从那里处理。如果失败,则会将其移至错误队列。 主管部门可能会将消息移回MyQueue以便再次处理。

我的任务是扫描/查看两个队列,以查找并计算已循环超过一小时的所有消息。

似乎

message.SentTime
message.ArrivedTime

都没用,因为每次消息进入队列时都会更新它们。

解决方法是在邮件正文中放置时间戳,但这需要我打开所有邮件以确定邮件是否“旧”。

有更好的选择吗?

2 个答案:

答案 0 :(得分:1)

问题是它不是循环队列的相同消息。 “移动”邮件通常会删除原始邮件并根据原始内容创建新邮件,这就是您无法使用已发送和到达时间的原因。

每次移动的消息都有新的唯一MessageID值吗?如果没有,那么也许你可以生成一个匹配MessageID的表到它最初创建的时间。

干杯
John Breakwell

答案 1 :(得分:0)

您可以为此使用Message类的AppSpecific属性。不幸的是,它是一个32位整数;如果它很长,您可以在那里存储DateTime.Ticks,然后将其用作计算消息周期所需的时间戳。

您可能会丢失Ticks中的一些位以使值适合AppSpecific,如下所示:

ticksInt = (int) DateTime.Now.Ticks >> 23;

这为您提供了第二级精度,我认为这足以满足您的需要......但是,如果您这样做,则无法使用内置的DateTime或TimeSpan方法从Ticks转换回来,因此您将拥有手动转换,或只计算Now与此值之间的差值。