繁体   English   中英

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

[英]Removing message from MSMQ in case of deserialization exception

目前我正在处理从本地私有 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 的情况下,我想从当前队列中删除此消息。 有谁知道如何解决这个问题?

使用Abort()方法并将 tx-object 创建移动到 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();
    }
}

中止() MSDN

tx.Commit()也在里面catch了块JsonSerializationException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM