首页 > 解决方案 > 当有任何新数据时,Spring Webflux 发送事件

问题描述

我正在尝试学习 Spring webflux & R2DBC。我尝试的一个是简单的用例:

  1. 有一张book桌子
  2. 创建一个/books提供文本流并返回的 API ( )Flux<Book>
  3. 我希望当我点击/books一次时,让我的浏览器保持打开状态,并将任何新数据插入到book表中,它将新数据发送到浏览器。

场景 2,仍然来自book表格:

  1. 有一张book桌子
  2. 创建一个/books/count返回数据计数book的API ( )Mono<Long>
  3. 我希望当我点击/books/count一次时,让我的浏览器保持打开状态,并将任何新数据插入/删除到book表中,它将新计数发送到浏览器。

但它不起作用。在我插入新数据后,没有数据发送到我的任何端点。
我需要点击/books/books/count获取更新的数据。
我认为要做到这一点,我需要使用服务器发送事件吗?但是如何做到这一点并查询数据呢?我得到的大多数样本都是简单的 SSE,它每隔一定的时间间隔发送一次字符串。

有什么样品可以做到这一点吗?

这是我的 BookApi.java

@RestController
@RequestMapping(value = "/books")
public class BookApi {

    private final BookRepository bookRepository;

    public BookApi(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }

    @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<Book> getAllBooks() {
        return bookRepository.findAll();
    }

    @GetMapping(value = "/count", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Mono<Long> count() {
        return bookRepository.count();
    }
}

BookRepository.java (R2DBC)

import org.springframework.data.r2dbc.repository.R2dbcRepository;

public interface BookRepository extends R2dbcRepository<Book, Long> {
}

图书.java

@Table("book")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {

    @Id
    private Long id;

    @Column(value = "name")
    private String name;

    @Column(value = "author")
    private String author;

}

标签: spring-webfluxspring-data-r2dbc

解决方案


使用处理器或接收器来处理 Book created 事件。

查看我使用 reactor Sinks 的示例,并阅读本文了解详细信息

或者使用可尾的 Mongo 文档。

一个可尾的 MongoDB 文档可以自动完成工作,检查同一个 repos 的主分支。

我上面的例子使用了 WebSocket 协议,很容易切换到SSERSocket


推荐阅读