0

netMsmqBinding (MSMQ3) を介した WCF サービスがあります。サービスの一部の操作にはトランザクション機能がなく、ロールバックできないため、サービス コードは WCF トランザクション制御の下で実行されません。私が理解しているように、これは、有害なメッセージ処理などの利点が得られないことを意味します。したがって、サービスコードが呼び出されると、メッセージは永遠にキューから外れます。

サービスに重大な障害が発生した場合に、それ以上メッセージが失われるのを防ぎたいと考えています。そのため、失敗したばかりのメッセージをログに記録し、単純な例外 (FaultException ではない) を発生させます。他のすべての WCF サービス バインディングと同様に、チャネル (この場合は MSMQ チャネル ディスパッチャ) に障害が発生し、キューからそれ以上メッセージを受信しないことが予想されます。

しかし、私はこの動作(しゃれなし)を機能させることができないようです。サービス コードが例外をスローするかどうかに関係なく、サービスにルーティングされるメッセージを取得し続けます。

ここで何か不足していますか?リクエストごとに新しいチャネルが作成されるという点で、netMsmqBinding は http バインディングのように動作しますか? もしそうなら、私の問題を解決する方法についてのアイデアをいただければ幸いです。

4

1 に答える 1

1

サービスの一部の操作にはトランザクション機能がなく、ロールバックできないため、サービス コードは WCF トランザクション制御の下では実行されません。私が理解しているように、これは、有害なメッセージ処理などの利点が得られないことを意味します.

トランザクションの制御は、あなた次第です。TransactionScopeトランザクショナルにしたいコードをラップします。このようにして、トランザクションであることが保証されます。カスタム コードを実装する場合、これはキューのプロパティです。または、各キューで個別に MSMQ のトランザクションを有効にすることができます。

ポイズン キューは自動ではありませんが、実際には完全に別のキューです。無効なメッセージを検出したときに書き込み、それに書き込みます。

そのため、失敗したばかりのメッセージをログに記録し、単純な例外 (FaultException ではない) を発生させます。

MSMQ からの受信時に例外を発生させても機能しません。例外をスローするものは何もありません。ここで、ポイズン キューの出番です。エラーが発生したことを示すために、ポイズン キューに書き込みます。

ここで何か不足していますか?リクエストごとに新しいチャネルが作成されるという点で、netMsmqBinding は http バインディングのように動作しますか?

netMsmqBinding は、サーバー側で読み取られるメッセージごとに新しいスレッドを生成しますが、MSMQ への書き込みは生成しません。各チャネルは個別のスレッドを生成します。

于 2012-08-27T20:04:48.650 に答える