問題タブ [saga]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
unit-testing - Saga に複数のハンドラーがある場合に NServiceBus Saga の単体テストを作成する方法
以前はこのテストを行っていましたが、問題なくパスしました (3 つのメッセージがすべて処理されると、物語は完了です。
ここで、TestSagaNonStartingMessage を独自のハンドラーに分割したいと考えており、次のことを行いました。
ただし、TestSagaNonStartingMessage を処理する場合、サガ データは以前のハンドラーから保持されません。
持続性に問題がありますか、それともテストの構成が不適切ですか?
nservicebus - NServiceBus saga が複数回開始されないようにするにはどうすればよいですか?
メッセージ「Event1」によって開始されるが、同じアプリケーション ID を持つ「重複した」開始メッセージの受信を無視するサガを作成したい (2 人以上のユーザーが短時間内に UI ボタンを押した場合に発生する可能性がある) . ドキュメントは、このアプローチが機能することを示唆しているようです:
- 佐賀が宣言
IAmStartedByMessages<Event1>
- 佐賀はそれ自体を構成します
ConfigureMapping<Event1>(s => s.SomeID, m => m.SomeID);
- Handle(Event1 evt) は、最初のメッセージを処理するときにブール値のフラグを設定し、フラグが既に設定されている場合はハンドラーから除外されます。
これは機能しますか?サブスクライバーがマルチスレッドの場合、競合状態は発生しますか? もしそうなら、どうすれば望ましい動作を達成できますか?
ありがとう!
import - NService Bus を使用したデータのインポート
NService バスの使用。2.00.19 (MSMQ および SQL 2008 を使用)
システムにデータをインポートしたいと考えています。
ファイルは非常に大きくなる可能性があるため、バスからメッセージを読み取るバックグラウンド プロセッサがあります。この処理には 1 時間かかる場合があります。
他の人はこれをしましたか?佐賀は前進する最善の方法ですか?
configuration - NHibernateSagaPersister との autowire の競合を解決するにはどうすればよいですか?
最初の Saga を接続しようとしていますが、受信エンドポイントで開始メッセージを適切に処理することができませんでした。次の例外が発生します。
SagaMessageHandler メッセージの処理に失敗しました。Spring.Objects.Factory.UnsatisfiedDependencyException: 'NServiceBus.Sagas.Impl.SagaMessageHandler' という名前のオブジェクトの作成中にエラーが発生しました: オブジェクト プロパティ 'Persister' を介して表現された満たされていない依存関係: タイプ [NServiceBus.Saga.ISagaPersister] の 2 つのオブジェクトがタイプごとに自動配線されています、オブジェクト 'NServiceBus.Sagas.Impl.SagaMessageHandler' のプロパティ 'Persister' を自動配線できるようにするためには 1 つしかないはずでした。
インメモリ パーシスタと NHibernateSagaPersister の両方が競合していると推測していますが、これを解決する方法がわかりません。私の構成はこれです:
LoadMessageHandlers() を削除すると、エラーは消えますが、もちろん私のハンドラーは呼び出されません。ここで何が問題なのですか?カスタム初期化を行わずにプロダクション プロファイルで AsA_Server を使用している場合、サガは適切に動作しますが、他の理由でそれを使用する必要があります。
nservicebus - NServiceBus では、一致するサガなしでメッセージが届いた場合、どのように処理できますか?
メッセージ 1 で開始され、メッセージ 2 で完了するなど、2 つのメッセージ タイプで構成されるサガがある場合、メッセージ 1 が存在しない状態でメッセージ 2 が着信した場合、コールバックを返すことはできますか? エラーキューにダンプされることはわかっていますが、最初のメッセージが存在しないためにエラー状態があることを送信クライアントに返すことができるようにしたいと考えています。
domain-driven-design - 過去の出来事に依存する佐賀
佐賀が作成される前に公開されたイベントに基づいて意思決定が行われる場合、佐賀をどのように処理するかについて質問があります。
これが私の問題を説明するための例です:
CustomerARとOrderARがあると想像してください。customerARが作成されると、検証プロセスが開始され、そのプロセスの結果は、顧客が特別な許可なしに自由に使用できる注文の金額になります。このプロセスは文脈から外れているため、ここでは詳しく説明しません。金額が計算されると、コマンドが計算された金額でCustomerARに送信され、CustomerARはその値でイベント(CustomerMaxOrderAmountEvent)を公開します。ここまでは順調ですね。
それから数週間後、顧客は注文をします。OrderARが作成され、OrderSagaが起動します。sagaは、注文が完全に作成されるまで待機してから、その注文に対してAutorizationCommandを送信する必要があるかどうかを判断する必要があります。その決定を行うには、CustomerMaxOrderAmountEventが公開されているかどうかと金額の値を知る必要があります。通常、OrderSagaはCustomerMaxOrderAmountEventもサブスクライブしますが、問題は、過去にすでに発生していたため、このイベントが発生しないことです。
これにどう対処すればいいですか。読み取りモデルにクエリを実行して値を確認する必要があります。コマンドを送信して値を取得する必要があります。CustomerARを参照する必要があります。また、佐賀のすべての履歴イベントを再生して、彼がすでに履歴を認識している必要があります。
アップデート
これは、この具体的な例ではなく、概念に関するものであることに注意してください。この例は、問題を明確にするためのものです。「同じ境界コンテキストの一部ではない、関連のない2つの集約ルート」。
助けてくれてありがとう。
メルビン
cqrs - イベントソーシングを使用した時間ベースのSagas
あるイベントによって作成され、座って数時間待って、何も起こらない場合はコマンドを送信するサガが必要だったとしましょう。
さて、この佐賀がすべてメモリ内にあり、アプリ/サーバーを再起動する必要がある場合、佐賀はアンロードされ、二度と表示されませんよね?
システムがオンラインに戻ったら、イベントソーシングを使用してこの佐賀を高速化できますか?
もしそうなら、私のSagasをスピードアップするために、システムの起動時に再生できる「アクティブなsagas」を備えたかなり別のイベントストアが必要になります。これまでのところ、それは私には良いように思えますが、タイムアウトをどのように実装しますか?
佐賀に入るイベントに応じて、いくつかの後続のタイムアウトがある可能性があることを考慮して、再生時にタイムアウトを「偽造」する何らかの方法が必要になります。
c# - 私の佐賀構造は正しい解決策ですか?(NServiceBus)
私はそれにまっすぐにカットします。銀行に送信されたファイルを介して、クレジット カードの支払いを自動化しようとしています。カードの支払いは、銀行でリアルタイムに検証されません。銀行は夜通し支払いを処理し、翌日、成功した支払いと失敗した支払いの両方を含む応答ファイルを送信します。
支払いを受け入れるかキャンセルすると、支払い/キャンセルの詳細を含むメッセージが (Bus.Send 経由で) コマンド メッセージ プロセッサに送信される Web アプリがあります。
次に、プロセッサは、すべてのサービスが参照できるようにこれを (Bus.Publish を介して) パブリッシュします。
1 つのサービスで次のことを行う必要があります。
- 最初のメッセージの受信で物語を開始する
- 営業終了のタイムアウト要求を発行する
- 後続のすべてのメッセージを (サガで) 受信したときに追跡します
- タイムアウトの受信時に、支払いとキャンセルのメッセージを銀行ファイルに変換します。
問題は、List<> が仮想メンバーとして許可されていないため、メッセージのコレクション (またはそれ以外のもの) をサガに格納する方法がわからないことです。
現在のサガ構造は次のとおりです。
何かご意見は?
c# - IFindSagas の実装に苦労している
1日続く物語があります。
メッセージを受信したら、アクティブなサガを見つけて、Handle(message) メソッドで処理したいと考えています。
現在のメソッドが必要なため、ConfigureHowToFindSagas メソッドはありません。受信したすべてのメッセージは、タイムアウト メッセージが受信されるまで、1 つのサガに影響を与えます。新しいメッセージを受信すると、現在のサガが完了し、新しいサガが作成されます。しかし、私が読んだことから、これを行うには IFindSagas を実装する必要があり、おそらく私自身の Saga 永続化も必要です。
どこから始めればよいか、またこれが正しい方法かどうかについてアドバイスが必要です。私はまだインターフェイスの使用に比較的慣れていないため、コード例は役に立ちます。
c# - Bus.Publish() またはサブスクリプションが原因の StackOverflowException?
タイムアウト メッセージが受信されるまで、指定されたタイプの受信メッセージを追跡するためにサガを使用するエージェントがあります。Timeout ハンドラーには、次のものがあります。
TransactionItems は ICollection です
以下は TransactionDetail クラスです。
サブスクリプションが設定されていない場合、Bus.Publish() 呼び出しは問題なく実行されます。別のサービスを購読している場合、次のエラー メッセージが表示されます。
タイプ 'System.StackOverflowException' の未処理の例外が mscorlib.dll で発生しました
オーバーフローに関するこれ以上の情報はありません: {現在のスレッドがスタック オーバーフロー状態にあるため、式を評価できません。}
私は自分の SagaPersister、Profile、および SagaRegistry を持っていますが、それらがこの問題に関連しているかどうかはわかりませんが、必要に応じて提供できます。