【发布时间】:2022-01-06 12:30:20
【问题描述】:
第一次
我正在尝试开发一个控制器来将DocumentDB 中的数据保存在AWS 中。
第一次保存,但第二次,我正在寻找保存在数据库中的这个寄存器,我得到了这个并更改了一些数据,然后保存,但是......
我收到此错误:
Caused by: com.mongodb.MongoCommandException: Command failed with error 301: 'Retryable writes are not supported' on server aws:27017. The full response is {"ok": 0.0, "code": 301, "errmsg": "Retryable writes are not supported", "operationTime": {"$timestamp": {"t": 1641469879, "i": 1}}}
这是我的java代码
@Service
public class SaveStateHandler extends Handler<SaveStateCommand> {
@Autowired
private MongoRepository repository;
@Autowired
private MongoTemplate mongoTemplate;
@Override
public String handle(Command command) {
SaveStateCommand cmd = (SaveStateCommand) command;
State state = buildState(cmd);
repository.save(state);
return state.getId();
}
private State buildState(SaveStateCommand cmd) {
State state = State
.builder()
.activityId(cmd.getActivityId())
.agent(cmd.getAgent())
.stateId(cmd.getStateId())
.data(cmd.getData())
.dataAlteracao(LocalDateTime.now())
.build();
State stateFound = findState(cmd);
if (stateFound != null) {
state.setId(stateFound.getId());
}
return state;
}
private State findState(SaveStateCommand request) {
Query query = new Query();
selectField(query);
where(request, query);
return mongoTemplate.findOne(query, State.class);
}
private void selectField(Query query) {
query.fields().include("id");
}
private void where(SaveStateCommand request, Query query) {
query.addCriteria(new Criteria().andOperator(
Criteria.where("activityId").is(request.getActivityId()),
Criteria.where("agent").is(request.getAgent())));
}
}
在AWS 中,他们建议使用retryWrites=false,但我不知道如何在Spring Boot 中使用。
我用Spring Boot 2.2.1
我尝试过这样做
@Bean
public MongoClientSettings mongoSettings() {
return MongoClientSettings
.builder()
.retryWrites(Boolean.FALSE)
.build();
}
但没用。
=================================================================================
第二次
我使用 SSH 隧道连接到 AWS DocumentDb。
使用这些数据库配置启动我的应用程序
@Configuration
@EnableConfigurationProperties({MongoProperties.class})
public class MongoAutoConfiguration {
private final MongoClientFactory factory;
private final MongoClientOptions options;
private MongoClient mongo;
public MongoAutoConfiguration(MongoProperties properties, ObjectProvider<MongoClientOptions> options, Environment environment) {
this.options = options.getIfAvailable();
if (StringUtils.isEmpty(properties.getUsername()) || StringUtils.isEmpty(properties.getPassword())) {
properties.setUsername(null);
properties.setPassword(null);
}
properties.setUri(createUri(properties));
this.factory = new MongoClientFactory(properties, environment);
}
private String createUri(MongoProperties properties) {
String uri = "mongodb://";
if (StringUtils.hasText(properties.getUsername()) && !StringUtils.isEmpty(properties.getPassword())) {
uri = uri + properties.getUsername() + ":" + new String(properties.getPassword()) + "@";
}
return uri + properties.getHost() + ":" + properties.getPort() + "/" + properties.getDatabase() + "?retryWrites=false";
}
@PreDestroy
public void close() {
if (this.mongo != null) {
this.mongo.close();
}
}
@Bean
public MongoClient mongo() {
this.mongo = this.factory.createMongoClient(this.options);
return this.mongo;
}
}
并且在本地,它会正确保存数据。
但是,如果我将 API 更新放入 AWS ECS 并尝试保存,则会出现相同的错误。
=================================================================================
依赖关系
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-mongodb</artifactId>
<version>4.1.4</version>
</dependency>
【问题讨论】:
-
@MuratKara 但我做到了,但仍然遇到同样的错误。
-
@DiegoMacario,您在本地和 aws 中的数据库版本是什么?
-
另外,你在 pom 中对 mongo db 的依赖是什么?
-
@AnandVarkeyPhilips 他们是一样的。
Version 4.0.0
标签: java spring spring-boot aws-documentdb