Как преобразовать блокирующий код в реактивный код - PullRequest
0 голосов
/ 15 декабря 2018

Я ищу хороший способ кодировать это:

MyCloudDTO saveInCloud(MyCloudDTO dto) {
   //sync http call :-(
   return cloudService.save(dto);
}

MyData saveInDb(MyData data) {
   //database call 
   return repository.save(data);
}

MyDTO save(MyDTO dto) {
   MyCloudDTO cloudDTO = mapper.map(dto);
   dto.setCloudId(saveInCloud(dto).getId());
   MyData data = mapper2.map(dto);
   dto.setDbId(saveInDb(data).getId());
   return dto;
}

С Spring WebFlux и Monos.

Основная проблема заключается в том, что я хочу сохранить базовый dto во время всехпроцесс, потому что картографы отображают только нужные им свойства и оставляют остальные.

Я нашел способ сделать это, но я не уверен, что это правильный / лучший способ сделать:

Mono<MyCloudDTO> saveInCloud(MyCloudDTO dto) {
   return reactiveCloudService.save(dto);
}

Mono<MyData> saveInDb(MyData data) {
   return reactiveRepository.save(data);
}

Mono<MyDTO> save(MyDTO dto) {

    Mono<MyDTO> baseMono = Mono.just(dto);

    Mono<MyCloudDTO> saveCloudMono = Mono.just(dto)
            .map(mapper::map)
            .flatMap(this::saveInCloud);

    Mono<MyDTO> mergeAfterCloudSave = Mono.zip(
            baseMono,
            saveCloudMono,
            (base, cloudDto) -> base.idCloud(cloudDto.getId())); //the setter return this


    Mono<MyData> saveDbMono = mergeAfterCloudSave
            .map(mapper2::map)
            .flatMap(this::saveInCloud);


    Mono<MyDTO> mergeAfterDbSave = Mono.zip(
            mergeAfterCloudSave,
            saveDbMono,
            (base, dbData) -> base.idDb(data.getId())); //the setter return this


    return mergeAfterDbSave;
}

Большое спасибо!

Saveriu

...