如何将阻塞代码转换为响应代码

时间:2018-12-15 19:36:48

标签: spring-webflux reactive

我正在寻找一种编写此代码的好方法:

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

0 个答案:

没有答案