如何使用Project reactor以反应方式保存

时间:2018-04-12 18:43:59

标签: spring spring-data reactive-programming project-reactor

假设我有一个如下所示的存储库:

import io.vavr.collection.HashMap;
import io.vavr.collection.List;

import io.vavr.collection.Map;
import io.vavr.control.Option;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Mono;


@Repository
class ImageSizeRepositoryInMemoryImpl implements ImageSizeRepository {

    private volatile Map<String, ImageSize> imageSizes = HashMap.empty();

    @Override
    public Mono<ImageSize> save(Mono<ImageSize> imageSize) {
        return imageSize.map(i -> {
            imageSizes.put(i.getName(), i);
            return i;
        });
    }

    @Override
    public Mono<Void> deleteByName(String name) {
        this.imageSizes = imageSizes.remove(name);
        return Mono.empty();
    }

    @Override
    public Option<ImageSize> findOneByName(String name) {
        return imageSizes.filter(t -> t._1.equals(name))
                .map(t -> t._2)
                .headOption();
    }

    @Override
    public List<ImageSize> findAll() {
        return imageSizes.values().toList();
    }
}

正如我们所看到的那样,存在将imageSize参数作为Mono的save方法... 所以如果想要被动,在这种方法中我应该避免任何阻塞操作...... 所以我的问题是: map运算符是否适合写入(imageSizes.put(i.getName(),i))?

1 个答案:

答案 0 :(得分:2)

Map应免费副作用。将其存储在哈希映射中的副作用应该在doXXX方法中完成 - 在您的情况下doOnNext

https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html#doOnNext-java.util.function.Consumer-