带有 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 db
和 Axon 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的主要内容,如果未能解决你的问题,请参考以下文章
带有 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 可用