在事务中接收消息

时间:2015-09-07 14:32:16

标签: c# msmq msmq-transaction

我正在编写一个基本的MSMQ制作人和消费者,当我尝试在交易中收到消息时,我会被绊倒。

该队列位于Windows Server 2003计算机上,并且肯定设置为事务性。我的生产者能够将消息作为事务的一部分放入队列而没有任何问题。只要我不在事务中执行,我也可以在没有问题的情况下从队列中读取消息。我做错了什么?

这是我正在尝试使用队列的代码块:

using (MessageQueue msgQ = new MessageQueue(myQueueName))
{                   
    try
    {
        using (MessageQueueTransaction msgTx = new MessageQueueTransaction())
        {
            msgTx.Begin();

            msg = msgQ.Receive(new TimeSpan(0, 0, 0, 0, 1000), msgTx);
            Console.WriteLine("Message " + msg.LookupId.ToString() + " received");
            msg.Formatter = new XmlMessageFormatter(new string[] { "System.String,mscorlib" });
            if (ParseMessage(msg.Body.ToString()))
            {
                msgTx.Commit();
                Console.WriteLine("Message " + msg.LookupId.ToString() + " delivered");
            }
            else
            {
                msgTx.Abort();
                Console.WriteLine("Message " + msg.LookupId.ToString() + " not delivered");
            }
        }
    }
    catch (MessageQueueException exc)
    {
        if (exc.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
            Console.WriteLine("No more messages available");
        else
            Console.WriteLine("Unknown error encountered while receiving");
    }
}

因此,如果我删除using (MessageQueueTransaction ...)封装,一切正常,当然我不能commitabort事务,具体取决于{{1}的布尔结果}

当我添加事务位时,只要我点击ParseMessage(...)行,我就会得到MessageQueueException。异常消息和base为null,msgQ.Receive(...)MessageQueueErrorCode,根据this MSDN page转换为:{/ p>

  

MQ_ERROR_OPERATION_NOT_SUPPORTED_BY_REMOTE_COMPUTER(0xC00E008B)

     

尝试使用时接收或查看消息时返回   来自驻留在运行的计算机上的远程队列的查找标识符   MSMQ 1.0或MSMQ 2.0。

现在,据我所知,我不是试图接收或查看基于查找标识符加上,MSMQ正在Windows Server 2003上运行,这意味着它应该是MSMQ 3.0。

我在这里弄错了什么?

1 个答案:

答案 0 :(得分:3)

您正在执行远程交易接收。这是在MSMQ 4.0中引入的。将服务器升级到支持的操作系统。

  

How do I get transactional remote receives with MSMQ?