【问题标题】:Eventstore dispatch flag set to true on restartEventstore 调度标志在重新启动时设置为 true
【发布时间】:2020-10-27 19:01:07
【问题描述】:

我正在使用 JOliver 的 EventStore,现在我正在使用同步调度程序,这样当命令进入时,它由我的命令处理程序处理,然后保存在事件存储中,然后我的事件处理程序更新我的读取模型。在这个阶段我没有使用 NServiceBus,但我希望稍后介绍它。我的 eventstore 数据库和 readmodel 在同一台机器上。

我注意到的是,如果在我的事件处理程序中引发了异常(而且由于我没有使用 DTC),那么事件将在事件存储中提交,并且调度标志设置为 false。这是我所期望的,但是当我重新启动服务器时,该标志设置为 true,但从未调用事件处理程序代码。

任何想法为什么会发生这种情况?

我假设任何未分派的事件都会被分派,或者在事件存储代码中会有一些重试机制。

【问题讨论】:

    标签: cqrs neventstore


    【解决方案1】:

    如果我没记错的话,一旦事件被存储,调度标志设置为 false 就应该发生。通常,您会在启动应用程序时像这样初始化事件存储:

    var storeEvents = Wireup.Init()
                      ...
                      .DispatchTo(new DelegateMessageDispatcher(dispatcher.dispatchCommit)
                      .Build();
    

    在此操作发生之前,该标志设置为 false dispatcher.dispatchCommit,一旦此操作成功,该标志设置为 true。

    您不会对聚合中的事件处理程序感到困惑吗?

    public void Apply(MystuffDone evt)
    {
       //code...
    }
    

    【讨论】:

    • 我的回答更多是关于您是否对来自聚合的事件处理程序和来自投影的事件处理程序感到困惑。我对阅读您关于您的确切意思的问题有些怀疑....
    • 因为在 J. Oliver 的 ES 中有一个针对非调度事件的重试机制。
    • 感谢您的帮助。需要明确的是,当第一次引发错误时,J. Oliver 的 ES 中的重试机制似乎不会触发投影事件处理程序代码。你注意到了吗?
    • 不。我的一个朋友在生产中遇到了完全相同的问题,但服务器已关闭。并且未分派的事件已成功重新分派,并且在重新启动后其标志设置为 true。到目前为止,我自己还没有测试过这个特定的场景。当我找到一些时间时,我会尝试复制它并让你知道(mmhh 可能会在几个月内......:p)祝你好运!
    • Dispatched 仅在消息“bus”(NServiceBus、MassTransit 等)确认对消息负有全部责任后才发送为 true。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    相关资源
    最近更新 更多