2015-09-07 66 views
2

我正在写一个基本的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取决于ParseMessage(...)

布尔结果当我虽然添加事务位交易,我得到一个MessageQueueException只要我打的msgQ.Receive(...)线。异常消息和底座为空并且MessageQueueErrorCode0xc00e008b其中,根据this MSDN page转换为:

当试图在使用 一个消息到接收或PEEK返回

MQ_ERROR_OPERATION_NOT_SUPPORTED_BY_REMOTE_COMPUTER(0xC00E008B)查找标识符来自位于运行 MSMQ 1.0或MSMQ 2.0的计算机上的远程队列。

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

我在这里发生了什么问题?

回答