在我开始处理队列中的消息之前,我需要收集所有“旧”消息并处理它们。之后我进入了读/循环循环。
GetAllMessages
将返回一组消息,但不会将它们从队列中删除。 Purge
将删除队列中的所有邮件。我需要做两件事作为交易。这可能吗?
答案 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我还没有尝试过。