我正在编写一个基本的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(...)
的布尔结果
当我添加事务位时,只要我达到msgQ.Receive(...)
行,我就会得到MessageQueueException
。异常消息和基为空,MessageQueueErrorCode
为0xc00e008b
,根据MSDN页面翻译为:
MQ_ERROR_OPERATION_NOT_SUPPORTED_BY_REMOTE_COMPUTER (0 xc00e008b)
当尝试接收或偷看使用驻留在运行的计算机上的远程队列中的查找标识符MSMQ 1.0或MSMQ 2.0
现在,据我所知,我没有试图接收或偷看基于查找标识符加上,MSMQ运行在Windows Server 2003上,这意味着它应该是MSMQ 3.0无论如何。
我在这里错了什么?
您正在执行远程事务接收。这是在MSMQ 4.0中引入的。将服务器升级到支持的操作系统。
如何使用MSMQ获得事务性远程接收?