springweb flux 服务器推送事件

本文介绍如何使用 Spring WebFlux 构建服务器推送事件(SSE)。通过示例代码展示了一种简单高效的方式,使得后端可以定时向客户端推送随机数。此方法避免了轮询带来的资源浪费,并且比 WebSocket 更易于实现。

以前做服务器推送一般用轮询,后端主动给客户端推送不是很好解决。有时候也可以采用websocket

 

现在看了springwebflux,用它自带的方法做服务器推送方便多了.

 

代码如下:

import org.springframework.http.codec.ServerSentEvent;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.util.function.Tuples;

import java.time.Duration;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 服务器推送事件
 * Created by mingge on 2018/5/4.
 */
@RestController
@RequestMapping("/sse")
public class SseController {
    @GetMapping("/randomNumbers")
    public Flux<ServerSentEvent<Integer>> randomNumbers() {
        return Flux.interval(Duration.ofSeconds(1))
                .map(seq -> Tuples.of(seq, ThreadLocalRandom.current().nextInt()))
                .map(data -> ServerSentEvent.<Integer>builder()
                        .event("random")
                        .id(Long.toString(data.getT1()))
                        .data(data.getT2())
                        .build());
    }
}

 

就定义普通的controller就可以了。

### 如何在 Spring Boot WebFlux 中实现请求与响应的数据流推送 Spring Boot WebFlux 提供了一种基于响应式的框架来构建非阻塞的 Web 应用程序。通过使用 `Flux` 和 `Mono` 这些 Reactor 类型,开发者可以轻松处理异步数据流,并支持实时数据推送功能。 #### 1. 使用 Server-Sent Events (SSE) 推送数据 Spring WebFlux 支持通过 SSE 来实现实时数据推送到客户端的功能[^2]。以下是具体实现方法: - **创建控制器** 控制器返回一个 `Flux<String>` 对象作为响应体,表示持续不断的数据流。 ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; @RestController public class SseController { @GetMapping(value = "/stream", produces = "text/event-stream") public Flux<String> streamEvents() { return Flux.interval(Duration.ofSeconds(1)) // 每隔一秒生成一次事件 .map(sequence -> "Event " + sequence); } } ``` 上述代码中,`Flux.interval()` 方法用于每隔一秒钟生成一个新的序列号,并将其转换为字符串形式发送给客户端。 --- #### 2. 处理 HTTP 请求头 如果需要获取请求中的特定头部信息,比如认证令牌,则可以通过以下方式完成[^4]: ```java @GetMapping("/header-example") public Mono<ServerResponse> handleRequestWithHeader(@RequestHeader("Authorization") String authHeader) { return ServerResponse.ok() .body(Mono.just("Received Header: " + authHeader), String.class); } ``` 此片段展示了如何利用 `@RequestHeader` 注解提取指定名称的请求头参数,并将它嵌入到响应消息里。 --- #### 3. 构建完整的项目结构 为了快速搭建一个具备 SSE 功能的应用实例,可以从官方仓库克隆示例工程并启动服务[^3]: ```bash $ git clone https://github.com/mkyong/spring-boot.git $ cd webflux-thymeleaf-serversentevent $ mvn spring-boot:run ``` 执行以上命令后即可运行该项目,在浏览器访问 `/stream` 路径便可观察到每秒更新的一条新事件记录。 --- #### 4. 测试 SSE 推送效果 对于前端部分,可以直接借助 HTML5 的 EventSource API 订阅来自服务器端的消息流: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>SSE Example</title> </head> <body> <h1>Receiving server-sent events...</h1> <ul id="events"></ul> <script type="text/javascript"> const eventSource = new EventSource('/stream'); eventSource.onmessage = function(event) { let li = document.createElement('li'); li.textContent = 'New message: ' + event.data; document.getElementById('events').appendChild(li); }; </script> </body> </html> ``` 当页面加载完成后会自动连接至 `/stream` 地址接收后续产生的所有通知。 --- ### 总结 综上所述,Spring Boot WebFlux 结合 SSE 技术非常适合用来开发高性能、低延迟的服务接口;不仅简化了传统轮询机制下的复杂度,还显著提升了用户体验质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值