我在远程MSMQ中使用事务时收到错误“在指定的队列中找不到请求的消息”。如果删除了事务或将队列移动到同一台机器,一切正常。该队列在Windows 2008计算机上,客户端(如下所示)在Windows 7计算机上运行。
//Throws above error
using (MessageQueueTransaction mqTxn = new MessageQueueTransaction())
{
mqTxn.Begin();
Message message = messageQueue.ReceiveById(peekedMessage.Id, mqTxn);
mqTxn.Abort();
}
//Throws above error
using (TransactionScope txnScope = new TransactionScope())
{
Message message = messageQueue.ReceiveById(peekedMessage.Id, MessageQueueTransactionType.Automatic);
}
//Works fine
Message message = messageQueue.ReceiveById(peekedMessage.Id);
P.S。 peekedMessage是在这些调用之前偷看的消息。我已经验证了peekedMessage.Id与第一个队列项匹配。该队列是事务性的。
答案 0 :(得分:8)
MessageQueueTransaction只能用于内部事务,因此在远程队列的情况下不起作用。
第二种方式(使用TransactionScope)可以使用DTC。 DTC应该在两端运行并正确配置。默认情况下,在Windows 2008和Windows 7中都会关闭DTC。此外,如果启用了防火墙,则DTC将被放入例外列表中。一旦完成,它就像一个魅力。