Возможно ли GetAllMessages и Purge в качестве транзакции - PullRequest
2 голосов
/ 26 апреля 2011

Прежде чем я начну обрабатывать сообщения в очереди, мне нужно собрать все «старые» сообщения и разобраться с ними. После этого я попадаю в цикл чтения / обработки.

GetAllMessages вернет массив сообщений, однако он не удалит их из очереди. Purge удалит все сообщения из очереди. Мне нужно сделать как транзакцию. Возможно ли это?

1 Ответ

1 голос
/ 27 апреля 2011

Похоже, вам нужно иметь дело с обработкой оставшихся сообщений после (пере) запуска службы.

Решение, которое я реализовал, просто использует настраиваемое время ожидания для управления циклом обработки, поэтому вашей службе не нужно беспокоиться о состоянии очереди - она ​​будет обрабатывать все, что там есть.

Вот простой пример 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 , который я сам еще не пробовал.

...