【发布时间】:2019-10-11 18:39:39
【问题描述】:
在我的应用程序中,我们使用 axon 3.3.3 和 mongo db 作为事件存储
每当用户更新他的个人资料信息时,我们都会保存所有事件。
下面是用例
- 用户创建了他的个人资料(聚合 ID:101) 在 mongodb(CreateEvent) 中已经保存了 101 个聚合 id。
-
用户更新了他的个人资料信息, 所以我们想将 UpdateEvent 存储在 mongo db(event store)中
但低于异常
13:52:49.643 [http-nio-7030-exec-3] 错误 oaccC[.[.[.[dispatcherServlet] - Servlet.service() 用于路径 [] 上下文中的 servlet [dispatcherServlet] 引发异常 [请求处理失败;嵌套异常是 org.axonframework.commandhandling.model.ConcurrencyException:序列 [0] 处的聚合 [101] 的事件已插入],其根本原因 com.mongodb.MongoBulkWriteException:服务器 127.0.0.1:27017 上的批量写入操作错误。写入错误:[BulkWriteError{index=0, code=11000, message='E11000 duplicate key error collection: mytest.domainevents index: uniqueAggregateIndex dup key: { : "101", : 0 }', details={ }}]。 在 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(MixedBulkWriteOperation.java:276)
那么我怎样才能保存更新的事件呢?
下面是mongo db中的uniqueAggregateIndex
{ “聚合标识符”:1, “序列号”: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();
}
【问题讨论】:
标签: java mongodb spring-boot axon