Spring WebFlux 实现 SSE 流式回复:类GPT逐字显示回复效果完整指南
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.MediaType;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Sinks;
@RestController
public class ServerSentEventsController {
// 使用 Sinks.Many 作为 Flux 发布者
private final Sinks.Many<String> sink = Sinks.many().replay().limit(100);
private final Flux<String> eventStream = sink.asFlux().map(data -> "data: " + data + "\n\n");
// 初始化发送一些事件
public ServerSentEventsController() {
sink.tryEmitNext("初始化事件1");
sink.tryEmitNext("初始化事件2");
}
// 发送事件的方法
public void sendEvent(String message) {
sink.tryEmitNext(message);
}
// 定义一个 API 端点来订阅事件流
@GetMapping(value = "/stream-sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> stream() {
return eventStream;
}
}
这段代码定义了一个简单的Spring WebFlux控制器,用于演示如何实现服务端发送事件(SSE)。它使用了Sinks.Many
作为一个简单的 Flux 发布者,并提供了一个 GET 接口来订阅这个事件流。通过sendEvent
方法,可以向这个流发送新的事件。
评论已关闭