You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:50:18