我正在开发一个使用Spring web Flux和mongo DB的项目,而我对反应式编程和WebFlux还是很陌生。
我有使用一种服务保存到3个集合中的方案。对于每个集合,im使用序列生成id,然后保存它们。我有FieldMaster,上面有List,每个Field Info都有List。我需要保存FieldMaster,FileInfo和FieldOption。以下是我正在使用的代码。该代码仅在我以调试模式运行时有效,否则它将在下面的行
处被阻止整数field_seq_id = Integer.parseInt(sequencesCollection.getNextSequence(FIELDINFO).block()。getSeqValue());
这是完整的代码
公共Mono
return fieldmaster.flatMap(fm -> {
return sequencesCollection.getNextSequence(FIELDMASTER).flatMap(seqVal -> {
LOGGER.info("Generated Sequence value :" + seqVal.getSeqValue());
fm.setId(Integer.parseInt(seqVal.getSeqValue()));
List<FieldInfo> fieldInfo = fm.getFieldInfo();
fieldInfo.forEach(field -> {
// saving Field Goes Here
Integer field_seq_id = Integer.parseInt(sequencesCollection.getNextSequence(FIELDINFO).block().getSeqValue()); // stops execution at this line
LOGGER.info("Generated Sequence value Field Sequence:" + field_seq_id);
field.setId(field_seq_id);
field.setMasterFieldRefId(fm.getId());
mongoTemplate.save(field).block();
LOGGER.info("Field Details Saved");
List<FieldOption> fieldOption = field.getFieldOptions();
fieldOption.forEach(option -> {
// saving Field Option Goes Here
Integer opt_seq_id = Integer.parseInt(sequencesCollection.getNextSequence(FIELDOPTION).block().getSeqValue());
LOGGER.info("Generated Sequence value Options Sequence:" + opt_seq_id);
option.setId(opt_seq_id);
option.setFieldRefId(field_seq_id);
mongoTemplate.save(option).log().block();
LOGGER.info("Field Option Details Saved");
});
});
return mongoTemplate.save(fm).log();
});
});
}
答案 0 :(得分:0)
在反应式编程中,首先使用.block不好,因为您将非阻塞代码转换为阻塞。如果您想从一个流中获取并保存为3个流,则可以这样做。 出于性能目的,有许多不同的方法可以执行此操作,但这取决于数据量。 在这里,您有一个使用简单数据并使用concat运算符的示例,但甚至还有zip和merge。这取决于您的需求。
public void run(String... args) throws Exception {
Flux<Integer> dbData = Flux.range(0, 10);
dbData.flatMap(integer -> Flux.concat(saveAllInFirstCollection(integer), saveAllInSecondCollection(integer), saveAllInThirdCollection(integer))).subscribe();
}
Flux<Integer> saveAllInFirstCollection(Integer integer) {
System.out.println(integer);
//process and save in collection
return Flux.just(integer);
}
Flux<Integer> saveAllInSecondCollection(Integer integer) {
System.out.println(integer);
//process and save in collection
return Flux.just(integer);
}
Flux<Integer> saveAllInThirdCollection(Integer integer) {
System.out.println(integer);
//process and save in collection
return Flux.just(integer);
}