Удаление сообщения из MSMQ в случае исключения десериализации - PullRequest
1 голос
/ 27 января 2020

В настоящее время я работаю над сервисом вдов, который получает сообщения от местного частного MSMQ. Очередь является транзакционной.

Прием осуществляется следующим образом:

public void ReceiveAndSaveData(MessageQueue queue, MsmqDbContext context)
        {
            var message = new Message();
            try
            {
                using (var tx = new MessageQueueTransaction())
                {
                    tx.Begin();
                    message = queue.Receive(tx);
                    var bodyReader = new StreamReader(message.BodyStream);
                    var jsonBody = bodyReader.ReadToEnd();
                    var messageData = JsonConvert.DeserializeObject<QueueMessage>(jsonBody);

                    /*THERE IS SOME DATA PROCESSING*/


                    tx.Commit();
                }
            }
            catch (JsonSerializationException e)
            {
                Logger.WriteError(new LogDetail("Error occured during deserializing incoming data.", e, message.Id));

            }
            catch (Exception e)
            {
                Logger.WriteError(new LogDetail("Error occured during saving data to database", e, message.Id));
            }
        }

В случае JsonSerializationException я хочу удалить это сообщение из текущей очереди. Кто-нибудь знает, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 27 января 2020

Используйте метод Abort(), а также переместите создание объекта tx за пределы блока try-catch.

public void ReceiveAndSaveData(MessageQueue queue, MsmqDbContext context)
{
    bool exceptionOccurred = false;
    var message = new Message();
    MessageQueueTransaction tx;
    try
    {
        exceptionOccurred = false;
        using (tx = new MessageQueueTransaction())
        {
            tx.Begin();
            message = queue.Receive(tx);
            var bodyReader = new StreamReader(message.BodyStream);
            var jsonBody = bodyReader.ReadToEnd();
            var messageData = JsonConvert.DeserializeObject<QueueMessage>(jsonBody);

            /*THERE IS SOME DATA PROCESSING*/

        }
    }
    catch (JsonSerializationException e)
    {
        Logger.WriteError(new LogDetail("Error occured during deserializing incoming data.", e, message.Id));
        tx.Abort(); //Rolls back the pending internal transaction
        exceptionOccurred = true;
    }
    catch (Exception e)
    {
        Logger.WriteError(new LogDetail("Error occured during saving data to database", e, message.Id));
         exceptionOccurred = true;
    }
    finally
    {
        if(!exceptionOccurred)
            tx.Commit();
    }
}

Abort () MSDN

0 голосов
/ 27 января 2020

Положите tx.Commit() также внутри блока catch JsonSerializationException

...