1

我正在使用 EventStore,一切似乎都在工作,事件由我的内存代理存储和调度,事件由我的读取模型处理。但是由于某种原因,EventStore Commits 表中的“已调度”标志没有设置,所以每次我重新启动我的应用程序时,它都会重播所有事件。我使用 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调度程序中的电线,该调度程序在处理的主线之外做自己的事情。例如,如果它有写入问题,命令处理线程将不会听到它。

使生活变得更简单的一种方法是将其更改为同步,以便您的命令处理链可以听到异常(请记住,调度异常不会回滚命令已处理并且事件现在已经发生的事实) .

但实际上,您需要通过 USL 查看连接的处理器UsingAsynchronousDispatchScheduler确实报告了问题,以便您的监控可以发现问题。

于 2012-10-08T12:56:01.857 回答