【问题标题】:is it possible to GetAllMessages and Purge as a transaction是否可以将 GetAllMessages 和 Purge 作为事务
【发布时间】:2011-04-29 15:25:35
【问题描述】:

在我开始处理队列中的消息之前,我需要收集所有“旧”消息并处理它们。之后我进入我的读取/处理循环。

GetAllMessages 将返回一个消息数组,但是它不会将它们从队列中删除。 Purge 将从队列中删除所有消息。我需要将两者都作为交易进行。这可能吗?

【问题讨论】:

    标签: msmq


    【解决方案1】:

    听起来您需要在(重新)启动服务后处理剩余消息。

    我实现的一个解决方案只是使用可配置的接收超时来控制处理循环,因此您的服务不需要担心队列的状态 - 它会处理那里的任何内容。

    这是一个简单的 C# 示例

    ...
    Message msg;
    MessageQueueTransaction currentTransaction = new MessageQueueTransaction();
    TimeSpan receiveTimeOut = new TimeSpan(0, 0, 30);
    
    while (MyService.IsRunning)
    {
        try
        {
            currentTransaction.Begin();
            msg = this.sourceQueue.Receive(receiveTimeOut, currentTransaction);
    
            // process your message here
    
            currentTransaction.Commit();
        }
        catch(MessageQueueException mqex)
        {
            switch(mqex.MessageQueueErrorCode)
            {
                case MessageQueueErrorCode.IOTimeout :
                    // That's okay ... try again, maybe there's a new message then
                    break;
    
                default :
                    // That's not okay ... abort transaction
                    currentTransaction.Abort();
            }
        }
    }
    

    我计划将超时延长为动态的,因为它会在每次抛出超时异常时增加超时,并在处理完消息后立即重置。

    Programming best Practices with MSMQ 中给出了一个简短的介绍,尽管它并不完全支持我提出的解决方案。


    再挖掘一下,我发现了an answer proposing MSMQ Activation,我自己还没有尝试过。

    【讨论】:

    • 你猜对了——我的问题是在重新启动时我必须以不同于正常运行状态的方式处理消息。但是,我同意您的观点,并且可能最终会使用这种方法。挫折之一是超时引发异常。就我而言,我正在使用 literator 方法读取队列,因此无法捕获异常。正是出于这个原因,我推迟了实施这种方法。感谢您的确认。
    • 在您的示例中,您使用 30 秒超时。等待有序关闭似乎需要很长时间。另一方面,我想知道短暂的超时(即 2 秒)是否会使系统陷入困境。我真的不喜欢这样的投票系统。有没有更好的方法来中断被阻止的接收?
    • @Ralph 30 秒超时只是为了这个示例。我在实施我的服务之前搜索了一段时间,使用这个超时似乎是 MS 提出的方式 - 我必须在我的书签中挖掘来支持它,但我会尽快将它添加为参考。无论如何,我更喜欢这个想法,而不是编写一个 wating 循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 2019-04-09
    • 2016-09-02
    • 2020-08-09
    相关资源
    最近更新 更多