Сохранение нескольких записей с использованием Web Flux и Mongo DB - PullRequest
0 голосов
/ 26 сентября 2019

Я работаю над проектом, который использует Spring web Flux и DB mongo, и я очень новичок в реактивном программировании и WebFlux.

У меня есть сценарий сохранения в 3 коллекции с использованием одного сервиса.Для каждой коллекции я генерирую идентификатор, используя последовательность, а затем сохраняю их.У меня есть FieldMaster, у которого есть Список, и у каждой Информации Поля есть Список.Мне нужно сохранить FieldMaster, FileInfo и FieldOption.Ниже код, который я использую.Код работает только тогда, когда я работаю в режиме отладки, в противном случае он блокируется в строке ниже

Integer field_seq_id = Integer.parseInt (sequenceCollection.getNextSequence (FIELDINFO) .block (). GetSeqValue ());

Вот полный код

public Mono createMasterData (Mono fieldmaster) {

    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();
        });
    });

}

1 Ответ

0 голосов
/ 26 сентября 2019

Сначала в реактивном программировании не стоит использовать .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);
}
...