在反序列化异常的情况下从MSMQ删除消息

问题描述 投票:0回答:2

目前,我正在使用寡妇服务,该服务正在从本地专用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,我想从当前队列中删除此消息。有人知道如何解决这个问题吗?

c# .net msmq
2个回答
0
投票

使用Abort()方法,还将创建tx对象移到try-catch块之外。

public void ReceiveAndSaveData(MessageQueue queue, MsmqDbContext context)
{
    var message = new Message();
    MessageQueueTransaction tx;
    try
    {
        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

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

Abort() MSDN


-1
投票

tx.Commit()也放入catchJsonSerializationException块内

© www.soinside.com 2019 - 2024. All rights reserved.