【问题标题】:Spring boot JPA with Axon带有 Axon 的 Spring Boot JPA
【发布时间】:2021-11-09 07:01:57
【问题描述】:

我想使用 Axon Framework 和 Axon Server 作为我的事件存储和事件总线以及包含 spring data jpa 的 spring boot 项目。

我有一个 docker-compose 启动 2 个容器 - postgres dbAxon Server。 我不希望 axon 使用 postgres 作为它的事件存储,我希望它使用 Axon Server 作为事件存储。 因此,我将 @EntityScan 添加到主类以指向我自己的 JPA 实体,当我启动我的 Spring Boot 应用程序时,出现以下异常:

Caused by: java.util.concurrent.ExecutionException: org.axonframework.lifecycle.LifecycleHandlerInvocationException: Failed during invocation of lifecycle handler [public void org.axonframework.axonserver.connector.processor.EventProcessorControlService.start()] on component [org.axonframework.axonserver.connector.processor.EventProcessorControlService@32f2de5c]

Caused by: org.axonframework.lifecycle.LifecycleHandlerInvocationException: Failed during invocation of lifecycle handler [public void org.axonframework.axonserver.connector.processor.EventProcessorControlService.start()] on component [org.axonframework.axonserver.connector.processor.EventProcessorControlService@32f2de5c]

Caused by: java.lang.reflect.InvocationTargetException: null

Caused by: org.axonframework.eventhandling.tokenstore.UnableToRetrieveIdentifierException: Exception occurred while trying to establish storage identifier

Caused by: java.lang.IllegalArgumentException: Unable to locate persister: org.axonframework.eventhandling.tokenstore.jpa.TokenEntry

Caused by: org.hibernate.UnknownEntityTypeException: Unable to locate persister: org.axonframework.eventhandling.tokenstore.jpa.TokenEntry

在我添加所有 JPA 依赖项之前它工作正常,但在我为 jpa 添加 spring-boot-starter 之后 我得到了上述异常

我该如何解决?

【问题讨论】:

    标签: spring-boot axon


    【解决方案1】:

    默认情况下,Axon Framework 将尝试在您的 postgres 上创建一些表。需要这些表来管理您的 Token、Sagas 等。 由于您添加了 @EntityScan 注释,因此现有的默认扫描机制将不再起作用。

    您可以快速查看其ref guide 如何解决您的问题。

    引用自文档:

    要注册 Axon 的 JPA 实体,请包含相关包,如下所述:

    • org.axonframework.eventhandling.tokenstore 包含事件处理器使用的 TokenStore 所需的实体。
    • org.axonframework.modelling.saga.repository.jpa 包含持久化 Sagas 所需的实体
    • 当使用关系数据库作为事件存储时,org.axonframework.eventsourcing.eventstore.jpa 包含 JPA 事件存储引擎所需的实体。

    【讨论】:

    • 感谢您的回答。问题是我不希望关系数据库充当事件存储。我希望 Axon 服务器成为我的事件存储。我还需要以上吗?
    • 前两个与事件存储无关,而是与框架如何工作有关!最后一个是关于 Event Store 的,在这种情况下你可以跳过那个。
    • 我明白了,谢谢。我添加了前 2 个包并得到了 org.postgresql.util.PSQLException: ERROR: relationship "token_entry" does not exist
    • 看看它是否对您有帮助:stackoverflow.com/questions/29087626/… ...这是一些您需要正确获取的 spring-data 配置,因为您不再使用所有自动配置的东西。
    • 补充一点,AxonFramework 上实体的默认名称是 TokenEntry,但默认情况下,Spring 会将其转换为 token_entry,如您所见,这将失败。
    【解决方案2】:

    我设法让它工作如下:

    我删除 @EntityScan 并使用自动配置扫描所有实体

    我添加到 application.properties 文件中

    spring.jpa.hibernate.ddl-auto=update
    

    数据库中所有axon需要的表都在那里。

    【讨论】:

      猜你喜欢
      • 2018-05-12
      • 2020-02-25
      • 2017-12-15
      • 1970-01-01
      • 2018-03-29
      • 2020-12-15
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      相关资源
      最近更新 更多