写一个 webflux sse的 demo
时间: 2023-11-29 08:40:46 浏览: 40
下面是一个使用 Spring WebFlux 和 Server-Sent Events(SSE)的简单示例。
1. 创建一个 SSEController 类,包含两个路由:
```java
@RestController
public class SSEController {
@GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamEvents() {
return Flux.interval(Duration.ofSeconds(1))
.map(sequence -> "SSE event #" + sequence);
}
@GetMapping("/sse.html")
public String home() {
return "<html><head><title>SSE Example</title></head><body>"
+ "<h1>SSE Example</h1>"
+ "<div id=\"messages\"></div>"
+ "<script>"
+ "var eventSource = new EventSource('/sse');"
+ "eventSource.onmessage = function(event) {"
+ " var messages = document.getElementById('messages');"
+ " messages.innerHTML += event.data + '<br>';"
+ "};"
+ "</script>"
+ "</body></html>";
}
}
```
第一个路由 `/sse` 返回一个 `Flux`,该 `Flux` 会在每秒发送一次消息。这里我们将其看作 SSE 事件流。
第二个路由 `/sse.html` 是一个简单的 HTML 页面,其中包含一个在 `body` 中的 `div` 元素,用于显示 SSE 事件的消息。
2. 在启动类中添加一个 `RouterFunction`,将 `/sse.html` 路由到 `SSEController.home()`,将 `/sse` 路由到 `SSEController.streamEvents()`。
```java
@SpringBootApplication
public class WebFluxSseDemoApplication {
public static void main(String[] args) {
SpringApplication.run(WebFluxSseDemoApplication.class, args);
}
@Bean
public RouterFunction<ServerResponse> routes(SSEController controller) {
return RouterFunctions.route(GET("/sse.html"), controller::home)
.andRoute(GET("/sse"), controller::streamEvents);
}
}
```
3. 启动应用程序并在浏览器中访问 `http://localhost:8080/sse.html`。您应该会看到一个 SSE 事件流正在显示在页面上。
这是一个非常简单的 SSE 示例,它每秒发送一个消息。您可以尝试在 `streamEvents()` 方法中更改消息发送频率,或者将其替换为从其他源(如数据库)检索事件的逻辑。