JOliver EventStore调度标志未设置,每次重启时都会重播事件

时间:2012-10-08 03:20:24

标签: c# event-store

我正在使用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);
        }
    }

1 个答案:

答案 0 :(得分:2)

调度程序中的

UsingAsynchronousDispatchScheduler连接在处理主线之外执行自己的操作。例如,如果写入有问题,命令处理线程就不会听到它。

让生活更简单不同的一种方法是将其更改为同步,以便命令处理链能够听到异常(请记住,调度异常不会回滚命令这一事实得到了处理,现在事件已经发生了。)

但实际上你需要USL来查看UsingAsynchronousDispatchScheduler所连接的处理器会报告哪些问题,以便您的监控可以解决问题。