Spring 使用 mongo 从 axonIQ 3 到 4 启动

Spring Boot with mongo from axonIQ 3 to 4

所以我试图将我的模块从使用 axonIQ 3.4 移动到 4.1,我使用 mongodb 来保存事件而不是 axon 服务器。

在 axon 3 中,您不需要使用 axon 服务器,而在 4 版本中它将是默认设置,除非您在 pom/build.gradle [=16= 中明确排除它]

compile('org.axonframework:axon-spring-boot-starter:4.1') {
    exclude group: 'org.axonframework', module: 'axon-server-connector'
}

我转移到新的 mongo 扩展以及旧库已被弃用

compile group: 'org.axonframework.extensions.mongo', name: 'axon-mongo', version: '4.1'

我还使用以下代码(如他们的教程中所述)来存储事件

@Bean
public EventStorageEngine storageEngine(MongoClient client) {
    return MongoEventStorageEngine.builder().mongoTemplate(DefaultMongoTemplate.builder().mongoDatabase(client).build()).build();
}

当我尝试 运行 应用程序时出现以下错误(甚至在尝试 运行 任何事件之前)

java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:724) ~[na:1.8.0_141] at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:531) ~[na:1.8.0_141] at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:355) ~[na:1.8.0_141] at sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.java:286) ~[na:1.8.0_141] at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:120) ~[na:1.8.0_141] at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:72) ~[na:1.8.0_141] at java.lang.reflect.Executable.declaredAnnotations(Executable.java:599) ~[na:1.8.0_141] at java.lang.reflect.Executable.declaredAnnotations(Executable.java:597) ~[na:1.8.0_141] at java.lang.reflect.Executable.getDeclaredAnnotations(Executable.java:588) ~[na:1.8.0_141] at java.lang.reflect.Method.getDeclaredAnnotations(Method.java:630) ~[na:1.8.0_141] at java.lang.reflect.AccessibleObject.getAnnotations(AccessibleObject.java:207) ~[na:1.8.0_141] at org.axonframework.common.annotation.AnnotationUtils.getAnnotation(AnnotationUtils.java:130) ~[axon-messaging-4.1.jar:4.1] at org.axonframework.common.annotation.AnnotationUtils.findAnnotationAttributes(AnnotationUtils.java:76) ~[axon-messaging-4.1.jar:4.1] at org.axonframework.common.annotation.AnnotationUtils.findAnnotationAttributes(AnnotationUtils.java:110) ~[axon-messaging-4.1.jar:4.1] at org.axonframework.spring.config.SpringAxonAutoConfigurer.lambda$null(SpringAxonAutoConfigurer.java:255) ~[axon-spring-4.1.jar:4.1] at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193) ~[na:1.8.0_141] at java.util.LinkedList$LLSpliterator.tryAdvance(LinkedList.java:1249) ~[na:1.8.0_141] at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126) ~[na:1.8.0_141] at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498) ~[na:1.8.0_141] at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485) ~[na:1.8.0_141] at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[na:1.8.0_141] at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230) ~[na:1.8.0_141] at java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196) ~[na:1.8.0_141] at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_141] at java.util.stream.ReferencePipeline.anyMatch(ReferencePipeline.java:449) ~[na:1.8.0_141] at org.axonframework.spring.config.SpringAxonAutoConfigurer.lambda$registerEventHandlerRegistrar(SpringAxonAutoConfigurer.java:257) ~[axon-spring-4.1.jar:4.1] at java.util.Iterator.forEachRemaining(Iterator.java:116) ~[na:1.8.0_141] at org.axonframework.spring.config.SpringAxonAutoConfigurer.registerEventHandlerRegistrar(SpringAxonAutoConfigurer.java:248) ~[axon-spring-4.1.jar:4.1] at org.axonframework.spring.config.SpringAxonAutoConfigurer.registerBeanDefinitions(SpringAxonAutoConfigurer.java:214) ~[axon-spring-4.1.jar:4.1] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.lambda$loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:358) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE] at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) ~[na:1.8.0_141] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars(ConfigurationClassBeanDefinitionReader.java:357) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:145) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:117) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE] at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:328) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE] at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:233) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:93) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:694) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532) ~[spring-context-5.0.7.RELEASE.jar:5.0.7.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) ~[spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395) [spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:327) [spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255) [spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243) [spring-boot-2.0.3.RELEASE.jar:2.0.3.RELEASE] at com.murex.quality.gate.QGApplication.main(QGApplication.java:16) [classes/:na]

如果我回滚到 axonIQ 3.4,一切正常,但无法使用 4.1

你得到的例外是,我认为,这与你使用 MongoDb 而不是 Axon Server 作为存储事件的方式无关 自动在分布式事务中路由您的所有消息。

异常指向 AnnotationUtils,一个实用程序 class Axon 用于检查您提供的组件上的 Axon 特定注释。更具体地说,当它试图找到 MessageHandler 注释时,它在 SpringAxonAutoConfigurer 中的检查失败。

每个 消息处理注释,尽管是命令、事件、Saga 事件、查询等等,都从这种类型扩展而来,但您的设置由于某种原因无法找到它。

然而,当从版本 3.x 移动到 4.x 时,Axon Framework 发生了什么,包层次结构发生了变化。 MessageHandler 处理程序注释从 Axon axon-core 模块中的包 org.axonframework.messaging.annotation 3.x 移动到 Axon axon-messaging 模块中的 org.axonframework.messaging 包 4.x.

您是否介意再次尝试 4.1,但首先清空您可能拥有的任何缓存,以确保您不会同时拥有 Axon 3.x 和 4.1?

希望这对您有所帮助! 如果不是,我们需要进一步观察。