5

MassTransitコンシューマーが実際にメッセージを取得する前にMSMQキューをPeek()できるかどうかについて興味があります。

ステップ/プロセスとは:

1)メッセージがキューに送信されました

2)消費者はそれを取得し、DB更新を行う必要があります-約5秒かかります

3)最初に機能した場合、消費者は2回目の更新を行う必要があります。

私の問題は、最初のDB更新が失敗した場合に、メッセージがキューに残っている場合(つまり、ネットワークの問題でdbに到達できない場合)をどのように処理できるかです。

現在、キューからメッセージを読み取るとすぐに削除され、DBの更新が失敗すると消えます。

さらに、電源障害をどのように処理できますか?つまり、コンシューマーによる「ジョブ」の途中で、それが何であれ(db updateなど)、電源が切れた場合など、プロセスを再実行するにはどうすればよいですか?キュー内のメッセージ?(とにかく私の現在のインスタンスでは)ジョブが新しい​​行をテーブルにプッシュしているとしましょう。つまり、最初に行が存在するかどうかを確認し、メッセージがドロップされるかどうかを確認し、そうでない場合はタスクを実行するコードを記述できますが、最初にプロセス全体を再実行するにはどうすればよいですか?

Peek()キューに入れてからタスクを実行し、キューのメッセージを実際に読んで削除できることを読みましたが、それが大量輸送機関で機能するかどうかを一生理解することはできません...少し失われました...

さらに、Masstransitが持っていることを知っています.RetryLaterが、それをプロセスで使用しますか?Initially-> When-> Then ->.RetryLater佐賀で?

どんなポインタもappeciatedされます

よろしくロビン

編集

PS:私はサガを使用しています...

Define(() =>
            {
                RemoveWhen(saga => saga.CurrentState == Completed);

                Initially(
                    When(NewAC)
                        .Then((saga, message) => saga.ProcessPSM(message),
                            InCaseOf<Exception>()
                               .TransitionTo(Problem)                                  
                                )
                        .Then((saga, message) => saga.PostProcessPSM())
                        .Complete()
                    );
                During(Problem,
                    When(Waiting)
                               // NOTE: THIS DOES NOT WORK!!!!
                        .RetryLater()
                    );
                });

RetryLaterは次のエラーをスローします:「メッセージは既存のサガでは受け入れられません」

「RetryLater」に他にどのようにアクセスできるかわかりません。

4

1 に答える 1

7

MassTransitは、基礎となるキューの概念を抽象化します。したがって、Peekは解決策ではありませんが、メッセージを再試行するための他の手段があります。エラーおよび障害状態の処理に関心がある場合は、次のメカニズムで十分です。

デフォルトでは、コンシューマーが例外をスローした場合、メッセージはN回再試行されます。

  • ここで、Nはバス上で構成され、デフォルトは5です。ServiceBusConfiguratorのSetDefaultRetryLimitを使用して、バスの初期化で変更できます。
  • 再試行された場合は、メッセージがキューの最後に追加されることを意味します

エラー処理のよりきめ細かいアプローチが必要な場合は、コンテキストコンシューマーを実装し、回復可能な例外または一時的な例外をキャッチして、手動でRetryLaterを呼び出すことができます。私が理解しているように、これを実行できる回数に制限はありません。

public class RetryConsumer : Consumes<AwesomeMessage>.Context
{

    public void Consume(IConsumeContext<AwesomeMessage> message)
    {
        try
        {
            Console.WriteLine("This is Attempt " + message.RetryCount);
            // Do Something
        }
        catch (SomeTransientException e)
        {
            message.RetryLater();
        }
    }
}
于 2012-12-21T12:21:52.380 に答える