Java Axon-在查询时进行投影的最简单方法

Java Axon-在查询时进行投影的最简单方法,java,domain-driven-design,event-sourcing,axon,Java,Domain Driven Design,Event Sourcing,Axon,我通常每个聚合有5-6个事件,并且不希望将投影存储在DB中。在查询时进行视图投影最简单的方法是什么?简单的回答是,没有简单/快速的方法可以做到这一点 然而,实现“在请求时重播给定事件”设置是可行的 我建议您采取以下几步措施: 创建要返回的查询模型,该模型可以处理事件(在模型上使用@EventHandler带注释的方法) 创建一个可以处理查询的组件,该查询将在第一步中返回查询模型(为此使用@QueryHandler注释方法) 查询处理组件应该能够从EventStore检索事件流。如果这是基于agg

我通常每个聚合有5-6个事件,并且不希望将投影存储在DB中。在查询时进行视图投影最简单的方法是什么?

简单的回答是,没有简单/快速的方法可以做到这一点

然而,实现“在请求时重播给定事件”设置是可行的

我建议您采取以下几步措施:

  • 创建要返回的查询模型,该模型可以处理事件(在模型上使用
    @EventHandler
    带注释的方法)
  • 创建一个可以处理查询的组件,该查询将在第一步中返回查询模型(为此使用
    @QueryHandler
    注释方法)
  • 查询处理组件应该能够从
    EventStore
    检索事件流。如果这是基于
    aggregateIdentifier
    ,请使用
    EventStore#readEvents(String)
    方法。如果需要整个事件流,则需要使用
    StreamableMessageSource#openStream(TrackingToken)
    方法(注意:
    EventStore
    接口实现
    StreamableMessageSource
  • 在处理查询时,创建一个
    注释EventHandlerAdapter
    ,为其提供一个查询模型的新实例
  • 对于在第3点中创建的事件流中的每个事件,调用
    AnnotationEventHandlerAdapter#handle(EventMessage)
    方法。此方法将调用查询模型对象上的
    @EventHandler
    注释方法
  • 如果流已耗尽,则可以确保查询模型的所有必要事件都已处理。因此,现在可以返回查询模型
  • 所以,再一次,我不认为这是过于琐碎,容易或快速设置。 此外,第3步还有一个警告。基于聚合标识符检索给定聚合的流非常快速/简洁,因为聚合通常没有太多事件

    但是,如果查询模型跨越多个聚合,则需要基于
    TrackingToken
    检索事件流,这样可以确保您在运行时拉入整个事件存储以实例化模型。当然,您可以微调希望事件流返回事件的时间点处理
    TrackingToken
    ,但是更改非常大,您将不完整且相对缓慢

    但是,您声明要检索给定聚合标识符的事件。 因此,我认为在您的场景中,这应该是一个可行的解决方案


    希望这会有所帮助!

    感谢您描述了这样做的方法。Axon中似乎根本不支持这种方法。这种实现的问题是事件的性质-投影必须保存所有事件(基本上投影只有列表eventHistory)-这使得存储投影不切实际(因为它实际上是重复的事件)。从事件存储的定义来看,您通常应该期望有两种方式从事件存储接收事件,一种是每个聚合标识符,另一种是给定时间点的事件流。因此,我的论点指出,对于每个聚合Id的视图,这将很好地工作,但对于其他排列,情况并非如此。不完全确定缺少功能或仅符合事件存储定义。无论如何,欢迎您为Axon提交功能请求: