带有 Axon 的 Spring Boot JPA

Posted

技术标签:

【中文标题】带有 Axon 的 Spring Boot JPA【英文标题】:Spring boot JPA with Axon 【发布时间】: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 之后 我得到了上述异常

我该如何解决?

【问题讨论】:

【参考方案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 看看它是否对您有帮助:***.com/questions/29087626/… ...这是一些您需要正确获取的 spring-data 配置,因为您不再使用所有自动配置的东西。 补充一点,AxonFramework 上实体的默认名称是 TokenEntry,但默认情况下,Spring 会将其转换为 token_entry,如您所见,这将失败。【参考方案2】:

我设法让它工作如下:

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

我添加到 application.properties 文件中

spring.jpa.hibernate.ddl-auto=update

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

【讨论】:

以上是关于带有 Axon 的 Spring Boot JPA的主要内容,如果未能解决你的问题,请参考以下文章

java 带有Spring Boot 1.5的JPA

带有 JPA 的 Spring Boot:将 @Entity 移动到不同的包

带有 Jackson 和 Spring Boot 的实体 JPA 中的循环引用

带有查询 Spring-Boot jpa 1.5 的可选参数

带有spring boot JPA Postgresql的data.sql未加载

Spring boot(带有 jpa 的 mysql):没有名为“entityManagerFactory”的 bean 可用