Похоже, вам нужно иметь дело с обработкой оставшихся сообщений после (пере) запуска службы.
Решение, которое я реализовал, просто использует настраиваемое время ожидания для управления циклом обработки, поэтому вашей службе не нужно беспокоиться о состоянии очереди - она будет обрабатывать все, что там есть.
Вот простой пример 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();
}
}
}
Я планировал увеличить время ожидания, чтобы оно было динамическим, так как оно будет увеличивать время ожидания каждый раз, когда генерируется исключение, и сбрасывает его, как только обрабатывается сообщение.
Краткое введение дано в Рекомендации по программированию с MSMQ , хотя оно точно не поддерживает мое предлагаемое решение.
Копая немного больше, я нашел ответ, предлагающий активацию MSMQ , который я сам еще не пробовал.