Reaktiivinen tietojen käyttö ja integrointi
Yhdistäkää WebFlux-sovelluksia reaktiivisiin tietovarastoihin ja integroikaa ne muihin reaktiivisiin komponentteihin.
Reaktiivinen tietojen käyttö ja integrointi on ilmainen Spring Boot 4:n kattava opas-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Spring Boot 4:n kattava opas-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Spring Boot 4:n kattava opas-kurssilla on yhteensä 4 oppituntia.
Reaktiivisen datan käytön tarpeet
Kun rakennatte reaktiivisia sovelluksia Spring WebFluxilla, perinteiset datankäyttömenetelmät, kuten Spring Data JPA tai tavallinen JDBC, eivät toimi. Miksi?
Nämä menetelmät ovat blokkaavia. Ne pysäyttävät sovelluksen säikeen tietokantaoperaatioiden valmistumista odotettaessa. Tämä on ristiriidassa reaktiivisen ohjelmoinnin ei-blokkaavan ja asynkronisen luonteen kanssa.
Reaktiivisiin tietovarastoihin tutustuminen
Reaktiivisen työnkulun säilyttämiseksi tarvitsemme reaktiivisia tietovarastoja ja ei-blokkaavaa I/O:ta tukevia ajureita. Nämä ajurit palauttavat Mono- tai Flux-olion, jolloin sovellus voi tehdä muuta työtä tietokannan käsitellessä pyyntöjä.
Yleisiä reaktiivisia tietokantoja ovat:
- MongoDB: NoSQL-dokumenttitietokanta.
- Cassandra: NoSQL-saraketietokanta.
- Redis: NoSQL-avain–arvo-tietovarasto, jota käytetään usein välimuistina.
- R2DBC: (Reactive Relational Database Connectivity) relaatiotietokantoja, kuten PostgreSQL:ää, MySQL:ää ja H2:ta, varten.
Reaktiivisen MongoDB:n määrittäminen
Esimerkeissämme keskitymme MongoDB:hen, joka on suosittu valinta reaktiivisiin sovelluksiin. Ensin tarvitsette oikean riippuvuuden tiedostoon pom.xml (Maven) tai build.gradle (Gradle):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>Tämä starter-riippuvuus tuo käyttöön Spring Data MongoDB Reactiven, jonka avulla MongoDB:n kanssa voi olla helposti vuorovaikutuksessa ei-blokkaavalla tavalla.
Reaktiivisten entiteettien määrittäminen
Perinteisen Spring Datan tapaan määritätte entiteetit, jotka vastaavat tietokannan kokoelmia. MongoDB:tä varten käytätte @Document-annotaatiota.
@Id-annotaatio merkitsee ensisijaisen avaimen kentän. Näin Spring Data tietää, miten yksilölliset dokumentit tunnistetaan.
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "products")
public class Product {
@Id
private String id;
private String name;
private double price;
public Product(String id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
// Getters and Setters (omitted for brevity)
public String getId() { return id; }
public String getName() { return name; }
public double getPrice() { return price; }
@Override
public String toString() {
return "Product{id='" + id + "', name='" + name + "'}";
}
}Reaktiivisten repositorioiden luominen
Entiteettien CRUD-operaatioita (Create, Read, Update, Delete) varten luotte repositorioiden rajapinnat. Reaktiivista MongoDB:tä varten laajennatte rajapintaa ReactiveMongoRepository.
Tämä rajapinta tarjoaa automaattisesti yleisten operaatioiden reaktiiviset versiot: yksittäiset tulokset palautetaan Mono- ja useat tulokset Flux-oliona.
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
public interface ProductRepository extends ReactiveMongoRepository<Product, String> {
// Custom reactive query methods can be added here
Mono<Product> findByName(String name);
Flux<Product> findByPriceGreaterThan(double price);
}Reaktiivisen tallennuksen simulointi
Kun tallennatte entiteetin reaktiivisen repositorion avulla, se palauttaa Mono<Product>-olion. Tämä Mono edustaa tuotetta sen tallentamisen jälkeen. Tilaamalla sen käynnistätte operaation ja käsittelette tuloksen.
Suorittakaa tämä esimerkki nähdäksenne, miten reaktiivinen tallennusoperaatio voidaan käsitellä:
import reactor.core.publisher.Mono;
class Item {
String id;
String name;
public Item(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() { return "Item{name='" + name + "'} "; }
}
public class Main {
public static void main(String[] args) {
Item newItem = new Item("101", "Reactive Widget");
// Simulate a reactive repository save method
Mono<Item> savedItemMono = Mono.just(newItem)
.doOnSuccess(item -> System.out.println("Simulating DB save for: " + item.name));
System.out.println("Initiating save operation...");
savedItemMono.subscribe(
item -> System.out.println("Saved item received: " + item),
error -> System.err.println("Error: " + error.getMessage()),
() -> System.out.println("Save process completed.")
);
}
}Reaktiivisen haun simulointi
Datan reaktiivinen hakeminen toimii samalla tavalla. Yksittäistä alkiota (esimerkiksi tunnisteen perusteella) varten saatte Mono-olion. Useita alkioita varten saatte Flux-olion. Tilaamalla nämä julkaisijat kulutatte niiden tuottaman datan.
Suorittakaa tämä koodi nähdäksenne, miten Mono- ja Flux-olioita käytetään haetun datan käsittelyyn:
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.Arrays;
import java.util.List;
class User {
String id;
String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() { return "User{name='" + name + "'} "; }
}
public class Main {
public static void main(String[] args) {
List<User> users = Arrays.asList(
new User("U1", "Alice"),
new User("U2", "Bob"),
new User("U3", "Charlie")
);
// Simulate finding a single user by ID
Mono<User> userMono = Mono.just(users.get(0));
System.out.println("\n--- Finding single user ---");
userMono.subscribe(user -> System.out.println("Found: " + user));
// Simulate finding all users
Flux<User> userFlux = Flux.fromIterable(users);
System.out.println("\n--- Finding all users ---");
userFlux.subscribe(user -> System.out.println("Found: " + user));
}
}Integrointi reaktiivisiin palveluihin
Spring WebFlux -sovelluksessa palvelukerros injektoi reaktiiviset repositoriot ja käyttää niiden Mono- ja Flux-palautustyyppejä. Näin reaktiivisia operaatioita voidaan ketjuttaa saumattomasti.
Palvelumetodi voi esimerkiksi tallentaa tuotteen ja palauttaa sen jälkeen tallennetun tuotteen tunnisteen kokonaisuudessaan reaktiivisen virran sisällä.
import reactor.core.publisher.Mono;
// Assume Product and ProductRepository are defined elsewhere
// import your.package.Product;
// import your.package.ProductRepository;
// This is a simplified example, not a full runnable app
// as it would require a full Spring Boot context.
class ProductService {
private final ProductRepository productRepository;
public ProductService(ProductRepository productRepository) {
this.productRepository = productRepository;
}
public Mono<String> createProduct(Product product) {
return productRepository.save(product)
.map(Product::getId);
}
public Mono<Product> getProductById(String id) {
return productRepository.findById(id);
}
}Reaktiivisten dataoperaatioiden ketjuttaminen
Reaktiivisen datankäytön todellinen voima tulee esiin operaatioita ketjutettaessa. Tietokannan Mono- ja Flux-virtoja voi muuntaa, suodattaa ja yhdistää muihin reaktiivisiin lähteisiin, kuten ulkoisiin API-kutsuihin tai muun palvelulogiikan tuottamaan dataan.
Näin voitte rakentaa monimutkaisia ja tehokkaita ei-blokkaavia datavirtoja.
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.Duration;
public class Main {
public static void main(String[] args) {
// Simulate fetching user IDs from a database (Flux)
Flux<String> userIds = Flux.just("userA", "userB", "userC");
// Simulate fetching user details for each ID (Mono)
Flux<String> userNames = userIds.delayElements(Duration.ofMillis(50))
.flatMap(id -> Mono.just("Name_" + id.toUpperCase()));
System.out.println("Fetching and transforming user data...");
userNames.subscribe(
name -> System.out.println("Processed User: " + name),
error -> System.err.println("Error: " + error.getMessage()),
() -> System.out.println("All users processed.")
);
// Keep main thread alive for async operations
try { Thread.sleep(500); } catch (InterruptedException e) {}
}
}Pikatesti: reaktiiviset repositoriot
Olette rakentamassa Spring WebFlux -sovellusta, jonka on muodostettava yhteys MongoDB-tietokantaan ei-blokkaavalla tavalla. Mitä Spring Data -rajapintaa repositorion tulee laajentaa, jotta saatte käyttöön reaktiiviset CRUD-operaatiot?
Kertaus: reaktiivinen datankäyttö
Hienoa työtä! Tässä oppitunnissa opitte reaktiivisen datankäytön merkityksestä Spring WebFlux -sovelluksissa ja siitä, miten se toteutetaan.
- Perinteinen blokkaava datankäyttö korvataan ei-blokkaavilla reaktiivisilla ajureilla.
- Spring Data tarjoaa reaktiivista CRUD-toiminnallisuutta varten rajapintoja, kuten
ReactiveMongoRepository. - Nämä repositoriot palauttavat yksittäisiä alkioita varten
Mono- ja useita alkioita vartenFlux-olioita. - Voitte ketjuttaa reaktiivisia operaatioita saumattomasti datankäytöstä muiden reaktiivisten komponenttien kanssa.
Tämä osaaminen on olennaista aidosti päästä päähän reaktiivisten sovellusten rakentamisessa!
Opi Java tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 21
- Oppitunnit
- 84
Usein kysytyt kysymykset
Onko oppitunti ”Reaktiivinen tietojen käyttö ja integrointi” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Spring Boot 4:n kattava opas-oppimispolun 3 oppituntia, myös oppitunnin “Reaktiivinen tietojen käyttö ja integrointi”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Spring Boot 4:n kattava opas-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Reaktiivinen tietojen käyttö ja integrointi”?
Yhdistäkää WebFlux-sovelluksia reaktiivisiin tietovarastoihin ja integroikaa ne muihin reaktiivisiin komponentteihin. Harjoittelet Spring Boot 4:n kattava opas-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Spring Boot 4:n kattava opas-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Spring Boot 4:n kattava opas-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Reaktiivinen tietojen käyttö ja integrointi”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Spring Boot 4:n kattava opas-oppitunnilla?
Kyllä. Jokainen Spring Boot 4:n kattava opas-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Johdatus reaktiiviseen ohjelmointiin
- Spring WebFlux ja Reactor Core
- Reaktiivinen tietojen käyttö ja integrointi
- Reactive Streams -virranhallinta ja virheenkäsittely