1

EventStore を使用していますが、動作しているように見えます。イベントはメモリ内ブローカーによって保存およびディスパッチされ、読み取りモデルによって処理されます。しかし、EventStore Commits テーブルの「dispatched」フラグが何らかの理由で設定されていないため、アプリを再起動するたびにすべてのイベントが再生されます。ストアとして SQL Server 2012 を使用しています。エラーは発生していません。このフラグが設定されない理由は何ですか?

私のコード:

   private static IStoreEvents BuildEventStore(IBroker broker)
    {
        return Wireup.Init()
            .UsingSqlPersistence(Constants.EventStoreConnectionStringName)
            .InitializeStorageEngine()
            .UsingJsonSerialization()
            .Compress()
            .UsingAsynchronousDispatchScheduler()
            .DispatchTo(new DelegateMessageDispatcher(c => DispatchCommit(broker, c)))

            .Build();
    }

    private static void DispatchCommit(IBroker broker, Commit commit)
    {
        foreach (var @event in commit.Events)
        { 
            if(!(@event.Body is IDomainEvent))
            {
                throw new InvalidOperationException("An event was published that is not an IDomainEvent: " + @event.Body.GetType());
            }

            broker.Publish((IDomainEvent)@event.Body);
        }
    }
4

1 に答える 1

2

UsingAsynchronousDispatchScheduler処理のメインラインから独自のことを行うディスパッチャ内のワイヤ。たとえば、書き込みに問題がある場合、コマンド処理スレッドはそれを認識しません。

生活をよりシンプルにする1つの方法は、同期に変更して、コマンド処理チェーンが例外について認識できるようにすることです(ただし、ディスパッチ例外は、コマンドが処理されてイベントが発生したという事実をロールバックしないことに注意してください)。 。

しかし、実際には、USLを使用して、接続されているプロセッサUsingAsynchronousDispatchSchedulerが問題を報告していることを確認して、監視で問題を検出できるようにする必要があります。

于 2012-10-08T12:56:01.857 に答える