如何解决尝试更新现有记录时未找到轴突聚合
我正在使用 Axon 和 MongoDB 来实现使用 CQRS 和事件溯源模式的微服务。当我第一次启动应用程序时,一切正常。我可以创建订单并更新该订单。重新启动应用程序后,我仍然可以创建订单并更新该订单,但是当我尝试更新以前的订单时,Axon 抛出 "Command 'com.example.demo.command.command.UpdateOrderCommand' resulted in org.axonframework.modelling.command.AggregateNotFoundException(The aggregate was not found in the event store)"
。我的理论是,当我创建订单时,它会创建一个 OrderAggregate 实例并使用该实例进行更新。但是当我重新启动应用程序时,该实例消失了,更新时我没有创建 OrderAggregate 实例。这是我的 OrderAggregate.java 文件:
package com.example.demo.command.aggreagate;
import com.example.demo.command.command.CreateOrderCommand;
import com.example.demo.command.command.UpdateOrderCommand;
import com.example.demo.common.event.OrderCreatedEvent;
import com.example.demo.common.event.OrderUpdatedEvent;
import com.example.demo.query.entity.Address;
import com.example.demo.query.entity.Product;
import lombok.extern.slf4j.Slf4j;
import org.axonframework.commandhandling.CommandHandler;
import org.axonframework.eventsourcing.EventSourcingHandler;
import org.axonframework.modelling.command.AggregateIdentifier;
import org.axonframework.modelling.command.AggregateLifecycle;
import org.axonframework.spring.stereotype.Aggregate;
@Aggregate
@Slf4j
public class OrderAggregate {
@AggregateIdentifier
private String _id;
private String customerId;
private int quantity;
private double price;
private String status;
private Product product;
private Address address;
private String createdAt;
private String updatedAt;
public OrderAggregate() {
}
@CommandHandler
public OrderAggregate(CreateOrderCommand command) {
log.info("CreateOrderCommand received.");
AggregateLifecycle.apply(new OrderCreatedEvent(command.getId(),command.getCustomerId(),command.getQuantity(),command.getPrice(),"ORDERED",command.getProduct(),command.getAddress(),command.getCreatedAt(),command.getUpdatedAt()));
}
@EventSourcingHandler
public void on(OrderCreatedEvent event) {
log.info("An OrderCreatedEvent occurred.");
this._id = event.getId();
this.customerId = event.getCustomerId();
this.quantity = event.getQuantity();
this.price = event.getPrice();
this.status = "CREATED";
this.product = event.getProduct();
this.address = event.getAddress();
this.createdAt = event.getCreatedAt();
this.updatedAt = event.getUpdatedAt();
}
@CommandHandler
public void on(UpdateOrderCommand command) {
log.info("UpdateOrderCommand received.");
AggregateLifecycle.apply(new OrderUpdatedEvent(command.getId(),"UPDATED",updatedAt));
}
@EventSourcingHandler
public void on(OrderUpdatedEvent event) {
log.info("An OrderUpdatedEvent occurred.");
this.quantity = event.getQuantity();
this.price = event.getPrice();
this.status = event.getStatus();
this.product = event.getProduct();
this.address = event.getAddress();
this.updatedAt = event.getUpdatedAt();
}
}
我尝试将 on(UpdateOrderCommand)
设为 OrderAggregate 构造函数。它有点工作,但在更新到数据库时删除了 updatedAt 字段。任何帮助表示赞赏!
编辑: 这些是我的 AxonConfig.java 和 MongoConfig.java 文件: AxonConfig.java
import com.mongodb.client.MongoClient;
import org.axonframework.eventsourcing.eventstore.EmbeddedEventStore;
import org.axonframework.eventsourcing.eventstore.EventStorageEngine;
import org.axonframework.eventsourcing.eventstore.EventStore;
import org.axonframework.extensions.mongo.DefaultMongoTemplate;
import org.axonframework.extensions.mongo.MongoTemplate;
import org.axonframework.extensions.mongo.eventsourcing.eventstore.MongoEventStorageEngine;
import org.axonframework.spring.config.AxonConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.data.mongodb.core.mapping.event.ValidatingMongoEventListener;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
public class AxonConfig {
@Bean
public EmbeddedEventStore eventStore(EventStorageEngine storageEngine,AxonConfiguration configuration) {
return EmbeddedEventStore.builder()
.storageEngine(storageEngine)
.messageMonitor(configuration.messageMonitor(EventStore.class,"eventStore"))
.build();
}
// The `MongoEventStorageEngine` stores each event in a separate MongoDB document
@Bean
public EventStorageEngine storageEngine(MongoClient client) {
return MongoEventStorageEngine.builder().mongoTemplate(DefaultMongoTemplate.builder().mongoDatabase(client).build()).build();
}
}
MongoConfig.java:
package com.example.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.mapping.event.ValidatingMongoEventListener;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
@Configuration
public class MongoConfig {
@Bean
ValidatingMongoEventListener validatingMongoEventListener(LocalValidatorFactoryBean validator) {
return new ValidatingMongoEventListener(validator);
}
}
编辑#2: 我更新了 AxonConfig.java 文件,这解决了我的问题:
package com.example.demo.config;
import com.mongodb.client.MongoClient;
import org.axonframework.config.Configurer;
import org.axonframework.config.DefaultConfigurer;
import org.axonframework.eventhandling.tokenstore.TokenStore;
import org.axonframework.eventsourcing.EventCountSnapshotTriggerDefinition;
import org.axonframework.eventsourcing.SnapshotTriggerDefinition;
import org.axonframework.eventsourcing.eventstore.EventStorageEngine;
import org.axonframework.extensions.mongo.DefaultMongoTemplate;
import org.axonframework.extensions.mongo.eventsourcing.eventstore.MongoEventStorageEngine;
import org.axonframework.extensions.mongo.eventsourcing.tokenstore.MongoTokenStore;
import org.axonframework.serialization.Serializer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AxonConfig {
@Autowired
public void configuration(Configurer configurer,MongoClient client) {
configurer.configureEmbeddedEventStore(configuration -> storageEngine(client)).eventProcessing(conf -> {
conf.registerTokenStore(configuration -> tokenStore(client,configuration.serializer()));
});
}
@Bean
public EventStorageEngine storageEngine(MongoClient client) {
return MongoEventStorageEngine.builder().mongoTemplate(DefaultMongoTemplate.builder().mongoDatabase(client).build()).build();
}
@Bean
public TokenStore tokenStore(MongoClient client,Serializer serializer) {
return MongoTokenStore.builder().mongoTemplate(DefaultMongoTemplate.builder().mongoDatabase(client).build()).serializer(serializer).build();
}
@Bean
public SnapshotTriggerDefinition snapshotTriggerDefinition(org.axonframework.config.Configuration configuration) {
return new EventCountSnapshotTriggerDefinition(configuration.snapshotter(),5);
}
@Bean
public Configurer configurer() {
return DefaultConfigurer.defaultConfiguration();
}
}
解决方法
正如在原帖的评论中提到的,这是一个配置问题。所以我继续深入挖掘,找到了 github 存储库,其中有一个示例:(https://github.com/AxonFramework/extension-mongo/tree/master/mongo-axon-example)。我实现了上面存储库中实现的配置文件,它就像一个魅力。感谢 Lucas Campos 和 Jan Gelinski 为我指明了正确的方向。我将根据我的解决方案相应地编辑原始帖子。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。