MSMQ からメッセージを取得してレガシー システム (Baan) にポストする Windows サービスを作成しています。投稿が失敗したり、投稿中にマシンがダウンしたりしても、メッセージを失いたくありません。したがって、MSMQ トランザクションを使用しています。失敗すると中止し、成功するとコミットします。
ローカル キューに対して作業する場合、このコードはうまく機能します。しかし、本番環境では、サービスを実行しているマシン (または複数のマシン) をキュー自体から分離したいと考えています。リモート キューに対してテストすると、「トランザクションの使用法が無効です」という System.Messaging.MessageQueueException がスローされます。
問題のキューがトランザクション対応であることを確認しました。
キューから受信するコードは次のとおりです。
// Begin a transaction.
_currentTransaction = new MessageQueueTransaction();
_currentTransaction.Begin();
Message message = queue.Receive(wait ? _queueTimeout : TimeSpan.Zero, _currentTransaction);
_logger.Info("Received a message on queue {0}: {1}.", queue.Path, message.Label);
WORK_ITEM item = (WORK_ITEM)message.Body;
return item;
答え
それ以来、私はSQL Service Brokerに切り替えました。リモート トランザクション受信をサポートしていますが、MSMQ 3.0 はサポートしていません。さらに、おまけとして、クラスター化してバックアップした SQL Server インスタンスを既に使用しています。