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」に他にどのようにアクセスできるかわかりません。