Удаленный MSMQ, транзакции и ReceiveById завершаются ошибкой - «Запрошенное сообщение не найдено в указанной очереди» - PullRequest
7 голосов
/ 08 декабря 2010

При использовании транзакций в удаленном 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 Ответ

8 голосов
/ 08 декабря 2010

MessageQueueTransaction может использоваться только для внутренних транзакций, поэтому он не будет работать в случае удаленной очереди.

Второй способ (с использованием TransactionScope) будет работать, так как он использует DTC.Код неисправности должен быть запущен и правильно настроен на обоих концах.По умолчанию код DTC отключен как в Windows 2008, так и в Windows 7. Кроме того, если включен брандмауэр, код DTC должен быть включен в список исключений.Как только это будет сделано, оно работает как шарм.

...