是否可以将GetAllMessages和Purge作为事务

时间:2011-04-26 14:13:09

标签: msmq

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

GetAllMessages将返回一组消息,但不会将它们从队列中删除。 Purge将删除队列中的所有邮件。我需要做两件事作为交易。这可能吗?

1 个答案:

答案 0 :(得分: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我还没有尝试过。