我正在查看 AxonIQ 框架,并设法启动并运行了一个测试应用程序。但是我有一个关于在使用在读取模型中具有持久性的存储时应如何处理 EventHandlers 的问题。
从我(可能天真)的理解来看。我的 Projection 类中的 @EventHandler 注释方法在第一次启动时从一开始就被调用。这种机制似乎假设投影利用某种在应用程序启动期间从头开始重新创建的易失性存储(例如,像 h2 这样的内存中 sql)。
但是,如果存储在 Elastic Search 之类的东西中是持久的,我希望 @EventHandler 从它的最后一个持久事件而不是从开始事件恢复。
有没有办法以这种方式控制@EventHandler 的行为?
Axon 有两种类型的事件处理器:订阅和跟踪。
订阅模式(这是 Axon 3 的默认模式)将在传递它们的线程中处理事件。这意味着您“受制于”交付事件的任何组件的交付保证。
跟踪模式(这是自 Axon 4 以来使用事件存储或其他支持它的源时的默认设置)将在专用线程中处理事件,由事件处理器本身管理。这意味着事件是从实际发布机制异步处理的。
跟踪事件处理器使用令牌来跟踪进度。这些令牌存储在 TokenStore 中,并随着处理器正确处理每个传入事件(可能是批处理的)而更新。您决定这些令牌的存储位置。如果您更新关系数据库,我们建议将令牌存储在同一数据库中,以便以原子方式更新事件更改和令牌。
如果您未指定任何 TokenStore,则取决于您是否使用 Spring Boot,在这种情况下,Axon 将尝试为您检测合适的 TokenStore 实现。否则,它很可能只是一个内存中的 TokenStore,这会导致处理器在每次启动时重新初始化(并且可能从头开始)。
配置 TokenStore
EventProcessingConfigurer,使用其中一种registerTokenStore(...)方法。当跟踪处理器启动时,它会检查令牌存储以获取先前的进度,并从那里自动继续。