2

基本的な 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やトランザクションを除いて、すべてが正常に機能します。abortParseMessage(...)

ただし、トランザクション ビットを追加するとMessageQueueException、回線に到達するとすぐに が表示されmsgQ.Receive(...)ます。このMSDNページによると、例外メッセージとベースはnullであり、これMessageQueueErrorCodeは次のように変換されます:0xc00e008b

MQ_ERROR_OPERATION_NOT_SUPPORTED_BY_REMOTE_COMPUTER (0xC00E008B)

MSMQ 1.0 または MSMQ 2.0 を実行しているコンピューターに存在するリモート キューからのルックアップ識別子を使用して、メッセージを受信またはピークしようとすると返されます。

現在、私の知る限りでは、検索識別子に基づいて受信またはピークしようとはしていません。また、MSMQ は Windows Server 2003 で実行されているため、MSMQ 3.0 である必要があります。

ここで何が間違っていますか?

4

1 に答える 1