Melaksanakan Kemas Kini Masa Nyata
Bangunkan penyelesai langganan dalam Spring Boot untuk menerbitkan peristiwa dan menghantar data langsung kepada klien.
Melaksanakan Kemas Kini Masa Nyata ialah pelajaran API GraphQL dengan Spring Boot percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran API GraphQL dengan Spring Boot, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus API GraphQL dengan Spring Boot merangkumi sejumlah 4 pelajaran.
Penjelasan Penyelesai Langganan
Langganan menyampaikan kemas kini masa nyata. Tidak seperti pertanyaan yang mengembalikan data sekali sahaja, penyelesai langganan mengembalikan strim data yang terus menolak kemas kini kepada klien.
Kita akan mempelajari cara melaksanakan strim ini dalam aplikasi Spring Boot GraphQL.
Memanfaatkan Reactor Flux
Spring GraphQL memanfaatkan Flux Project Reactor untuk mengendalikan langganan. Flux mewakili strim tak segerak tanpa sekatan yang mengandungi 0 hingga N item.
- Ia sesuai untuk penghantaran data berterusan.
- Anda boleh mengeluarkan berbilang nilai dari semasa ke semasa.
Skema untuk Kemas Kini Masa Nyata
Mula-mula, kita mentakrifkan langganan dalam Bahasa Takrifan Skema (SDL) GraphQL. Contoh ini menunjukkan langganan untuk mesej baharu:
type Subscription {
messageAdded(channelId: ID!): Message
}
type Message {
id: ID!
text: String!
channelId: ID!
timestamp: String!
}Mencipta Penyelesai Langganan
Dalam Spring Boot, penyelesai langganan ialah kaedah yang dianotasi dengan @SubscriptionMapping. Ia mesti mengembalikan Flux bagi jenis yang dikehendaki.
Kita akan menggunakan Sinks.Many untuk mengurus dan menerbitkan peristiwa ke dalam strim ini.
import org.springframework.graphql.data.method.annotation.SubscriptionMapping;
import org.springframework.stereotype.Controller;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Sinks;
@Controller
public class MessageSubscriptionController {
private final Sinks.Many<Message> messageSink =
Sinks.many().multicast().onBackpressureBuffer();
@SubscriptionMapping
public Flux<Message> messageAdded() {
return messageSink.asFlux();
}
}Menerbitkan Peristiwa dengan Sinks.Many
Entiti Sinks.Many bertindak sebagai penerbit peristiwa kita. Apabila peristiwa berlaku (contohnya, mesej baharu dicipta), kita menggunakan kaedah tryEmitNext() untuk menghantar data ke dalam strim.
Data ini kemudiannya mengalir melalui Flux kepada semua pelanggan GraphQL yang bersambung.
public class MessageService {
private final Sinks.Many<Message> messageSink;
public MessageService(Sinks.Many<Message> messageSink) {
this.messageSink = messageSink;
}
public Message createMessage(String text, String channelId) {
// ... save message to DB ...
Message newMessage = new Message("1", text, channelId, "now");
messageSink.tryEmitNext(newMessage); // Publish the new message
return newMessage;
}
}Persediaan Contoh Boleh Dijalankan Lengkap
Mari bina aplikasi Spring Boot lengkap yang boleh dijalankan. Kita akan mentakrifkan rekod Message dan komponen MessagePublisher untuk mengurus Sinks.Many kita.
record Message(String id, String text, String channelId, String timestamp) {}
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Sinks;
@Component
public class MessagePublisher {
private final Sinks.Many<Message> messageSink =
Sinks.many().multicast().onBackpressureBuffer();
public Flux<Message> getMessageStream() {
return messageSink.asFlux();
}
public void publishMessage(Message message) {
messageSink.tryEmitNext(message);
}
}Aplikasi Utama & Penyelesai
Sekarang, kita sambungkan MessagePublisher kepada penyelesai @SubscriptionMapping. Kelas Main mensimulasikan penghantaran mesej selepas suatu kelewatan.
Jalankan contoh ini untuk melihat penerbitan pada bahagian pelayan berfungsi!
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.graphql.data.method.annotation.SubscriptionMapping;
import org.springframework.stereotype.Controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.Duration;
@SpringBootApplication
public class Main implements CommandLineRunner {
@Autowired
private MessagePublisher messagePublisher;
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
@Override
public void run(String... args) throws Exception {
// Simulate sending a message after 2 seconds
Mono.delay(Duration.ofSeconds(2))
.subscribe(l -> {
Message msg = new Message("2", "Hello from Spring!", "general", "now");
messagePublisher.publishMessage(msg);
System.out.println("Published: " + msg);
});
}
}
@Controller
class MessageSubscriptionController {
private final MessagePublisher messagePublisher;
public MessageSubscriptionController(MessagePublisher messagePublisher) {
this.messagePublisher = messagePublisher;
}
@SubscriptionMapping
public Flux<Message> messageAdded() {
return messagePublisher.getMessageStream();
}
}
record Message(String id, String text, String channelId, String timestamp) {}Menapis Peristiwa Langganan
Klien sering memerlukan kemas kini yang khusus kepada kriteria tertentu. Kita boleh menapis Flux berdasarkan argumen yang dihantar kepada langganan.
Di sini, klien hanya menerima mesej untuk channelId yang ditentukan.
import org.springframework.graphql.data.method.annotation.Argument;
// ... other imports ...
@Controller
class MessageSubscriptionController {
private final MessagePublisher messagePublisher;
public MessageSubscriptionController(MessagePublisher messagePublisher) {
this.messagePublisher = messagePublisher;
}
@SubscriptionMapping
public Flux<Message> messageAdded(@Argument String channelId) {
return messagePublisher.getMessageStream()
.filter(msg -> msg.channelId().equals(channelId));
}
}Memisahkan Penerbitan Peristiwa
Untuk seni bina yang lebih baik, amalan yang baik ialah memisahkan penerbitan peristiwa daripada logik perniagaan teras anda.
- Ini memastikan perkhidmatan anda bersih dan tertumpu.
- Ini membolehkan berbilang pelanggan bebas bertindak balas terhadap peristiwa yang sama tanpa gandingan ketat.
- Pertimbangkan penggunaan
ApplicationEventPublisherSpring atau bas peristiwa khusus untuk tujuan ini.
Semakan Penyelesai Langganan
Anda telah mempelajari cara melaksanakan penyelesai langganan dalam Spring Boot. Mari uji pemahaman anda!
Imbas Kembali: Kemas Kini Masa Nyata
Anda telah berjaya mempelajari cara melaksanakan kemas kini masa nyata menggunakan langganan GraphQL dalam Spring Boot!
- Penyelesai langganan mengembalikan
Flux. Sinks.Manydigunakan untuk menerbitkan peristiwa ke dalamFlux.- Anda boleh menapis strim berdasarkan argumen langganan.
- Memisahkan logik penerbitan meningkatkan kebolehselenggaraan.
Pelajari API GraphQL dengan Spring Boot dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 12
- Pelajaran
- 48
Soalan Lazim
Adakah pelajaran “Melaksanakan Kemas Kini Masa Nyata” percuma?
Ya — teks penuh “Melaksanakan Kemas Kini Masa Nyata” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus API GraphQL dengan Spring Boot, tingkat taraf kepada CoddyKit PRO. Kursus API GraphQL dengan Spring Boot merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Melaksanakan Kemas Kini Masa Nyata”?
Bangunkan penyelesai langganan dalam Spring Boot untuk menerbitkan peristiwa dan menghantar data langsung kepada klien. Anda berlatih API GraphQL dengan Spring Boot menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan API GraphQL dengan Spring Boot?
Tiada pengalaman terdahulu diperlukan. Pembelajaran API GraphQL dengan Spring Boot di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Melaksanakan Kemas Kini Masa Nyata” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran API GraphQL dengan Spring Boot ini?
Ya. Setiap pelajaran API GraphQL dengan Spring Boot menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Memahami Langganan GraphQL
- Melaksanakan Kemas Kini Masa Nyata
- Menyepadukan WebSockets dengan Spring
- Penapisan dan Penskalaan Langganan