2

延期されたメッセージング機能を使用して、将来のある時点でメッセージを送信したが、後でそのメッセージをキャンセルしたいとします。

質問1-元のbus.Defer(...)電話をかけるときに、そのメッセージの一意の識別子を取得するにはどうすればよいですか?ある種のメッセージIDまたはタイムアウトIDがあると思います。

質問2-RavenDBデータベースを直接呼び出す以外に、保留中のすべての遅延メッセージを取得するためにバスにクエリを実行する方法はありますか?

質問3-延期されたメッセージをキャンセルする方法はありますか?私は次のようなものを期待しますbus.CancelDeferred(messageid)

これのいずれかが利用可能ですか、または同様の結果を達成するために使用できる他のメカニズムはありますか?

4

2 に答える 2

4

延期されたメッセージと未処理の応答を数回放棄する必要がありましたが、それは私のサガで「相関IDをインクリメントする」ことによって行いました。しかし、あなたはサガについて言及していないので、この解決策があなたに使えるかどうかはわかりません。しかし、私はそれがあなたが求める「他のメカニズム」の下にあると思います:)

この例を確認してください-ここに、特にカスタムが含まれている私のサガの状態がありますCorrelationId

public class MySagaData : ISagaData
{
    // ... the usual stuff here

    public string CorrelationId { get; set; }
}

次に、メッセージを延期したり、何かを要求したりするたびに、延期されたメッセージや応答を相関IDの現在の値と相関させます。

bus.Defer(time, new Something { CorrelationId = Data.CorrelationId });

bus.Send(new SomeRequest { CorrelationId = Data.CorrelationId });

したがって、延期されたメッセージと応答を、佐賀の現在の状態と概念的に相関させます。

そして、未処理のメッセージをすべて破棄したい場合は、サガの相関IDを新しい値にリセットするだけです。通常は値をのように設定しますsomethingWithBusinessMeaning/timestamp

このように、放棄されたメッセージはどのsagaインスタンスとも相関せず、事実上無視されます。

それは意味がありますか?

于 2012-11-06T15:12:47.760 に答える
3

1)現在これを行う方法はありません。それらを追跡する必要がある場合は、アプリ固有のIDを使用して独自のヘッダーを追加できます

2)いいえ、あなたが言及したようにストレージを照会する必要があります。それは、これのユースケースは何でしょうか?

3)いいえ、これは仕様によるものです。メッセージがいつ到着するかを想定できないことを考えると、遅延メッセージがキューにスタックされ、キャンセルした直後に処理される可能性があるため、タイムアウトがキャンセルされることに依存することはできません。「キャンセル」メッセージも失われる可能性があります。

つまり、コードは、何があっても「無効な」メッセージを破棄するように準備する必要があります。

于 2012-11-06T08:55:09.233 に答える