5

WCF netMSMQbinding を使用すると、順序どおりの配信を保証できますか?

挿入コマンドに続いて多数の更新コマンドを同じキューに入れていますが、時折、更新の 1 つが挿入よりも優先されます。

広範なログを追加すると、それらが正しい順序でキューに追加され、異なる順序で処理されていることが明らかです。

この動作が予想されることを示すいくつかの記事を Google で検索しましたが、どうにかして順序付けられるように構成する必要があるようです。

私たちのキューはトランザクションであるため、シーケンス番号を追加して宛先で再シーケンスすることは機能しないと思います。トランザクション性が失われるためです。

属性を追加する[DeliveryRequirements(RequireOrderedDelivery=true, QueuedDeliveryRequirements=QueuedDeliveryRequirementsMode.Require)]と、次のエラーが発生します。

コントラクト「IService」の DeliveryRequirementsAttribute は、NotAllowed の QueuedDeliveryRequirements 値を指定します。ただし、このコントラクト用に構成されたバインディングは、キュー配信をサポートすることを指定しています。キューに入れられたバインディングは、このコントラクトでは使用できません。

すべてが正しくセットアップされているように見えるため、このエラーが発生する理由がわかりません。ただし、この設定がMSMQで許可されていることを確認することはできませんでした.WS-RM設定のようであり、知る限りnetMSMQBindingはWS-RMをサポートしていません.

4

3 に答える 3

3

MSMQ は注文済みの配信をサポートしていないため、できません。

MSMQ のバインディング機能を指定するクラスである System.ServiceModel.Channels.MsmqBindingElementBase+BindingDeliveryCapabilitiesHelper と、そのプロパティの実装方法を見てください。

bool IBindingDeliveryCapabilities.AssuresOrderedDelivery
{
    get
    {
        return false;
    }
}
于 2009-04-08T13:17:36.590 に答える
2

Simon Gittinsからのこの投稿は、注文された配達が可能であることを示唆しているようです。

結局のところ、この状況に対処する文書化されていない機能があります。

  • バッチサイズがONEのTransactedBatchingBehaviorをサービスエンドポイントに適用します。
  • ReleaseServiceInstanceOnTransactionCompleteは、サービス実装でtrueに設定する必要があります。

これらの2つのことが行われると、私のテストプログラムは順不同のメッセージを生成しなくなります。

于 2009-08-17T11:53:11.427 に答える
1

メッセージをグループ化できるように見えるため、コントラクトで順序を指定できます。メッセージのグループ化に関するこのMSDN の記事を確認してください。

于 2009-04-10T16:28:33.267 に答える