Function<Connection, Publisher<? extends Result>> results = connection -> connection .createStatement("SELECT * FROM robot") .execute(); Mono.from(connectionPublisher) .flatMapMany(results) .flatMap(res -> res.map((row, meta) -> row.get("name", String.class))) .doOnNext(System.out::println) .doOnError(exc -> System.out.println("Sniff..." + exc)) .doOnComplete(() -> System.out.println("FINI !")) .subscribe(); Et si on met tout ça ensemble, ça donne à peu près ça ! (la prochaine fois, j’essaie un titre encore plus long…) R2DBC Project Reactor + Reactive Streams +
FROM robot WHERE name = :name") .bind("name", name) .map(row -> Robot.builder() .name(row.get("name", String.class)) .movie(row.get("movie", String.class)) .build()) .all(); PAS MAL, PAS MAL… MAIS UN PEU BAS NIVEAU… DatabaseClient
@Query("select distinct movie from robot") Flux<String> getMovies(); } Reactive***Repository ET MAINTENANT, CA MARCHE AVEC UNE BASE RELATIONNELLE ! @GetMapping("/robot") public Flux<Robot> find(@RequestParam String name) { return repository.findByName(name); }
.then(movieRepository.save(movie)) .then(); } Et avec un zeste de transaction ! public Mono<Void> create(Robot robot, Movie movie) { TransactionalOperator rxtx = TransactionalOperator.create(reactiveTxManager ); return robotRepository.save(robot) .then(movieRepository.save(movie)) .then() .as(rxtx::transactional); }
standardiser l’accès aux bases de données relationnelles en mode réactif - Il y a aussi du Batch, des Entity Callbacks, de l’Observability, … - Support de la communauté (clients, drivers, …) - On peut faire du R2DBC sans aucun autre framework, mais ça va être un peu roots :) Mais il reste du boulot ! - Des frameworks en cours de mises à jour (Liquibase, …) - Spring : pas de support des relations dans les entités :(