我正在使用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);
}
}
答案 0 :(得分:2)
UsingAsynchronousDispatchScheduler
连接在处理主线之外执行自己的操作。例如,如果写入有问题,命令处理线程就不会听到它。
让生活更简单不同的一种方法是将其更改为同步,以便命令处理链能够听到异常(请记住,调度异常不会回滚命令这一事实得到了处理,现在事件已经发生了。)
但实际上你需要USL来查看UsingAsynchronousDispatchScheduler
所连接的处理器会报告哪些问题,以便您的监控可以解决问题。