我正在使用 EventStore,事情似乎正在工作,事件由我的内存中代理存储和调度,事件由我的读取模型处理。 但是由于某种原因,EventStore 提交表中的"已调度"标志未设置,因此每次重新启动应用程序时,它都会重播所有事件。 我正在使用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);
}
}
程序中UsingAsynchronousDispatchScheduler
电线,调度程序在处理的主线之外执行自己的操作。例如,如果它在写入时出现问题,则命令处理线程不会听到它。
使生活更简单的一种方法是将其更改为同步,以便您的命令处理链能够听到异常(请记住,调度异常不会回滚命令已处理并且事件现已发生的事实)。
但实际上,您需要 USL 查看UsingAsynchronousDispatchScheduler
接线的处理器会报告问题,以便您的监控可以发现问题。