API GraphQL dengan Spring Boot · Pelajaran

Melaksanakan Kemas Kini Masa Nyata

Bangunkan penyelesai langganan dalam Spring Boot untuk menerbitkan peristiwa dan menghantar data langsung kepada klien.

Pelajaran 2 daripada 411 langkah

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 ApplicationEventPublisher Spring 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.Many digunakan untuk menerbitkan peristiwa ke dalam Flux.
  • Anda boleh menapis strim berdasarkan argumen langganan.
  • Memisahkan logik penerbitan meningkatkan kebolehselenggaraan.
Percuma untuk bermula

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

  1. Memahami Langganan GraphQL
  2. Melaksanakan Kemas Kini Masa Nyata
  3. Menyepadukan WebSockets dengan Spring
  4. Penapisan dan Penskalaan Langganan
← Kembali ke API GraphQL dengan Spring Boot