远程MSMQ,事务和ReceiveById失败 - “在指定的队列中找不到请求的消息”

时间:2010-12-08 01:26:13

标签: .net transactions msmq

我在远程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与第一个队列项匹配。该队列是事务性的。

1 个答案:

答案 0 :(得分:8)

MessageQueueTransaction只能用于内部事务,因此在远程队列的情况下不起作用。

第二种方式(使用TransactionScope)可以使用DTC。 DTC应该在两端运行并正确配置。默认情况下,在Windows 2008和Windows 7中都会关闭DTC。此外,如果启用了防火墙,则DTC将被放入例外列表中。一旦完成,它就像一个魅力。