8

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 インスタンスを既に使用しています。

4

5 に答える 5

5

これが問題の原因だと思うので、使用している MSMQ のバージョンについて質問するコメントを残しました。Transactional Receive は、MSMQ の以前のバージョンでは実装されていませんでした。その場合は、このブログ投稿でオプションについて説明します。

于 2008-09-25T14:26:12.100 に答える
3

MSDTC が両方のマシンで実行されていれば、TransactionScope の使用は機能するはずです。

MessageQueue queue = new MessageQueue("myqueue");
using (TransactionScope tx = new TransactionScope()) {
    Message message = queue.Receive(MessageQueueTransactionType.Automatic);
    tx.Complete();
}
于 2008-09-25T14:23:49.813 に答える
0

それ以来、私はSQL Service Brokerに切り替えました。リモート トランザクション受信をサポートしていますが、MSMQ 3.0 はサポートしていません。さらに、おまけとして、クラスター化してバックアップした SQL Server インスタンスを既に使用しています。

于 2008-10-07T13:56:34.657 に答える
0

リモート MSMQ の使用を回避します (それ以外の場合は、リモート MSMQ トランザクションをサポートするために MSMQ 4.0 にアップグレードします)。1) または、1 つの Web サービスを作成してメッセージをプッシュすることもできます 2) トランザクション目的でローカル MSMQ を作成します 3) バンドル (バッチ) 番号とメッセージ番号を持つ小さなユーティリティを作成します...バッチが失敗したら、ターゲットでメッセージを削除します。取引範囲として

于 2010-11-16T09:41:45.660 に答える