如何用Java编写每隔5秒返回重复文本的无限流式Web API?
Java实现定时无限流Web API的几种方式
下面介绍三种可行的实现方案,每种都包含具体代码和操作步骤:
1. Spring Boot + Server-Sent Events(SSE)
SSE是专门用于服务器向客户端推送事件的标准,非常适配这种定时重复推送的场景。
实现步骤:
- 创建Spring Boot项目,引入
spring-boot-starter-web依赖 - 编写Controller,使用
SseEmitter处理流式响应
import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; import java.util.concurrent.TimeUnit; @RestController public class StreamController { @GetMapping(value = "/abcd", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter streamText() { SseEmitter emitter = new SseEmitter(Long.MAX_VALUE); // 设置永不超时 new Thread(() -> { try { while (true) { emitter.send("\"some text\""); TimeUnit.SECONDS.sleep(5); } } catch (IOException | InterruptedException e) { emitter.completeWithError(e); } finally { emitter.complete(); } }).start(); return emitter; } }
测试:
启动项目后执行curl 'http://localhost:8080/abcd',就能每隔5秒收到"some text"。
2. 原生Servlet实现
如果不想依赖Spring框架,直接用Servlet API也能实现,核心是操作响应输出流并定时刷新。
实现步骤:
- 创建Servlet项目,编写自定义Servlet
- 设置响应内容类型为
text/event-stream,禁用缓存后循环输出内容
import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet("/abcd") public class StreamServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/event-stream"); resp.setCharacterEncoding("UTF-8"); resp.setHeader("Cache-Control", "no-cache"); PrintWriter writer = resp.getWriter(); try { while (true) { writer.println("\"some text\""); writer.flush(); // 强制输出到客户端 Thread.sleep(5000); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { writer.close(); } } }
测试:
部署到Servlet容器(如Tomcat)后,执行curl 'http://localhost:8080/abcd'即可看到预期效果。
3. Spring WebFlux响应式实现
如果项目采用响应式编程模型,Spring WebFlux的Flux可以更简洁地实现无限流。
实现步骤:
- 创建Spring Boot项目,引入
spring-boot-starter-webflux依赖 - 编写响应式Controller,用
Flux.interval生成定时事件
import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; import java.time.Duration; @RestController public class ReactiveStreamController { @GetMapping(value = "/abcd", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> streamText() { return Flux.interval(Duration.ofSeconds(5)) .map(sequence -> "\"some text\""); } }
测试:
启动项目后执行curl 'http://localhost:8080/abcd',同样会每隔5秒收到推送的文本。
内容的提问来源于stack exchange,提问作者Sujith
相关产品推荐
相关产品推荐

