K2mil J33
K2mil J33

Reputation: 165

How to save in reactive way using Project reactor

lets say that I have a repository like below:

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

As we can see there is save method that takes imageSize argument as Mono... So if want to be reactive, in this method I should avoid any blocking operation... So my question is: Is map operator the right place to write (imageSizes.put(i.getName(), i))?

Upvotes: 1

Views: 1368

Answers (1)

Maciej Walkowiak
Maciej Walkowiak

Reputation: 12932

Map should be side effects free. Side effect like storing it in hash map should be done in doXXX methods - in your case doOnNext

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

Upvotes: 2

Related Questions