【问题标题】:Find old messages in MSMQ在 MSMQ 中查找旧消息
【发布时间】:2011-01-27 23:53:13
【问题描述】:

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

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

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

好像

message.SentTime
message.ArrivedTime

两者都是无用的,因为每次消息进入队列时它们都会更新。

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

还有更好的选择吗?

【问题讨论】:

    标签: .net msmq


    【解决方案1】:

    问题在于在队列中循环的消息不同。 “移动”消息通常是删除原始消息并根据原始内容创建新消息,这就是您不能使用发送和到达时间的原因。

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

    干杯
    约翰·布雷克韦尔

    【讨论】:

    • 感谢您对消息移动方式的输入和解释。看起来如果不自己做一些家务,就无法完成我的使命
    【解决方案2】:

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

    您可能会丢失 Ticks 中的一些位以将值放入 AppSpecific 中,如下所示:

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

    这为您提供了第二级精度,我认为这对于您的情况已经足够了......但是如果您这样做,您不能使用从 Ticks 转换回来的内置 DateTime 或 TimeSpan 方法,因此您将拥有手动转换,或者只计算Now 和这个值之间的增量。

    【讨论】:

    • 感谢您的好回答!不幸的是,队列由 NServiceBus 管理,因此不是我的代码填充队列,据我所知,我不可能让 NServiceBus 使用时间戳填充 message.AppSpecific。
    猜你喜欢
    • 2015-10-18
    • 2011-05-28
    • 2010-12-27
    • 2017-11-11
    • 2018-02-20
    • 2011-07-12
    • 2015-05-24
    • 1970-01-01
    相关资源
    最近更新 更多