我正在编写一个基本的 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 ...)
封装,一切正常,当然除了我不能commit
或abort
事务取决于布尔结果ParseMessage(...)
但是,当我添加事务位时,我一上线MessageQueueException
就得到了msgQ.Receive(...)
。异常消息和基数为空MessageQueueErrorCode
,0xc00e008b
根据此 MSDN 页面,它转换为:
MQ_ERROR_OPERATION_NOT_SUPPORTED_BY_REMOTE_COMPUTER (0xC00E008B)
当尝试使用位于运行 MSMQ 1.0 或 MSMQ 2.0 的计算机上的远程队列中的查找标识符来接收或查看消息时返回。
现在,据我所知,我并不想根据查找标识符接收或查看,MSMQ 正在 Windows Server 2003 上运行,这意味着它应该是 MSMQ 3.0。
我在这里做错了什么?