MSMQ忽略事务范围

3

我正在尝试从MSMQ私有队列中读取数据,并尝试测试故障,以便我可以确信如果进程没有完成,则详细信息会保留在队列中。目前,在我的事务范围内,它会触发我的throw new Exception行并像预期的那样掉入catch块,但看起来似乎transaction.Complete已经运行,因为在抛出异常后,队列为空:这是我的代码片段 -

try
        {

            using (TransactionScope transaction = new TransactionScope())
            {

                Message incoming = new Message
                {
                    Formatter = formatter,
                    AcknowledgeType = AcknowledgeTypes.FullReceive,
                    Recoverable = true

                };

                incoming = msgQ.Receive(new TimeSpan(0, 0, 3), MessageQueueTransactionType.Single);

                if (incoming != null)
                {
                    MemoryStream mem = (MemoryStream) incoming.BodyStream;
                    mem.Seek(0, SeekOrigin.Begin);
                    IFormatter ifm = new BinaryFormatter();
                    var deserialisedMessage = (TravelMessageServiceObjects) ifm.Deserialize(mem); 
                    ISubmissionsService submissionsService = new SubmissionsService();
                    bool retVal = submissionsService.PerformSubmission(deserialisedMessage.Products, deserialisedMessage.PolicyReference);
                    if (!retVal)
                    {

                        string errorMessage = string.Concat("Policy Ref: ", deserialisedMessage.PolicyReference,
                            " Product: ", Enum.GetName(typeof(Products), deserialisedMessage.Products));
                        throw new Exception(errorMessage);
                    }
                }
                transaction.Complete();
            }

        }
        catch (Exception ex)
        {
            IError logger = new Logger();
            logger.Log(this, SeverityEnum.Warning, ex);

        }
1个回答

4
将您的队列设置为事务性。

enter image description here

MessageQueueTransactionType设置为AutomaticSingle仅适用于内部消息队列事务。
incoming = msgQ.Receive(new TimeSpan(0, 0, 3), MessageQueueTransactionType.Automatic);

请检查,MSDTC 是否正常工作。

请检查,防火墙是否阻止通信。


是的,这是事务性的。 - bilpor
我还尝试将transactionScope类更改为MessageQueueTransaction。 MessageQueueTransaction transaction = new MessageQueueTransaction(); try { transaction.Begin(); Message incoming = msgq.Receive(new TimeSpan(0,0,3), transaction); 现在,在Receive行上出现错误:事务操作序列无效。 - bilpor
我已将transactionType设置为自动,现在我收到以下错误:无法导入交易。 - bilpor
@bilpor,这样会更好,检查MSDTC是否在所有包含进程的服务器上都能正常工作。 - Backs
好的,在托管MSMQ的服务器上,我已将MSDTC设置为使用本地协调器,服务器名称为'MessagingServer'。在尝试从队列中读取的机器上,我已将远程协调器的主机名设置为'MessgingServer'。现在当我尝试运行时,我收到以下错误:与底层事务管理器的通信失败。 - bilpor
@bilpor,请检查防火墙。它们可能会阻止通信。 - Backs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接