Axon MongoDB - message='E11000 重复键错误收集唯一聚合索引 dup 键: { : "101", : 0 }



在我的应用程序中,我们使用Axon 3.3.3和Mongo DB作为活动商店

我们有任何情况在用户更新他的个人资料信息时保存所有事件。

以下是用例

  1. 用户创建了他的个人资料(汇总ID:101(在MongoDB(CreateEvent(中,已保存使用101个汇总ID。
  2. 用户已更新了他的个人资料信息,因此,我们想将更新Event存储在Mongo DB(活动商店(

    但要低于异常

    13:52:49.643 [HTTP-NIO-7030-EXEC-3]错误O.A.C.C.C.C。[。请求处理失败;嵌套的异常是org.axonframework.commandhandling.model.model.concurrencyexception:已插入序列[10]的汇总[101]事件]com.mongodb.mongobulkwriteException:服务器上的批量写入操作错误127.0.0.1:27017。写错误:[bulkwriteError {index = 0,代码= 11000,message ='e11000重复键错误收集:mytest.domainevents index:iniqueAgeRegregeGateExtex dup dup键:{:" 101",:0},:0}',lidese = {}}}]。 在com.mongodb.connection.bulkwritebatchcombiner.geterror(bulkwritebatchcombiner.java:176( 在com.mongodb.connection.bulkwritebatchcombiner.throwonerror(bulkwritebatchcombiner.java:205( 在com.mongodb.connection.bulkwritebatchcombiner.getresult(bulkwritebatchcombiner.java:146( 在com.mongodb.operation.bulkwritebatch.getresult(bulkwritebatch.java:227( 在com.mongodb.operation.mixedbulkwriteoperation.executebulkwritebatch(mixhbulkwriteoperation.java:276(

那么如何保存更新的事件?

下面是mongo db

中的独立性

{ "聚合识别器":1, " SequenceNumber":1}

@Value("${mongo.host:127.0.0.1}")
private String mongoHost;
@Value("${mongo.port:27017}")
private int mongoPort;
@Value("${mongo.db:mytest}")
private String mongoDB;
@Bean
public MongoSagaStore sagaStore() {
    return new MongoSagaStore(axonMongoTemplate());
}
@Bean
public TokenStore tokenStore(Serializer serializer) {
    return new MongoTokenStore(axonMongoTemplate(), serializer);
}
@Bean
public EventStorageEngine eventStorageEngine(Serializer serializer) {
    return new MongoEventStorageEngine(serializer, null, axonMongoTemplate(), new DocumentPerEventStorageStrategy());
}
@Bean
public MongoTemplate axonMongoTemplate() {
    return new DefaultMongoTemplate(mongo(), mongoDB);
}
@Bean
public MongoClient mongo() {
    MongoFactory mongoFactory = new MongoFactory();
    mongoFactory.setMongoAddresses(Collections.singletonList(new ServerAddress(mongoHost, mongoPort)));
    return mongoFactory.createMongo();
}

轴突使用该索引来确保在聚合中没有并发动作。毕竟,骨料是一个一致性边界,所有状态的变化都应是原子和高度一致的。

将索引更改为非唯一是一个坏主意。它只允许插入与已在事件商店中已经发生冲突的事件。

鉴于问题似乎是在序列#0处,因此您可能意外地将@CommandHandler方法建模为构造函数。Axon专门通过创建新实例来处理这些命令处理程序,而不是尝试加载现有的实例。在您的情况下,由于某些事件已经存储。

已经存在聚合。

最新更新