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

Spring中SSE的SseEmitter为何需用ExecutorService发送?不用会怎样?

为什么SseEmitter发送操作要放在ExecutorService中执行?

核心原因

  • 避免阻塞Spring MVC核心线程池:Spring MVC依靠内置线程池处理所有HTTP请求,如果直接在请求处理线程里执行SseEmitter的发送逻辑(比如循环推送事件、等待数据源),该线程会被长时间占用,无法释放回线程池。当存在大量SSE长连接时,很快会耗尽线程池资源,导致后续请求无法被处理。
  • 契合SSE的异步设计:SSE(Server-Sent Events)本身是为异步服务器推送场景设计的,用独立线程池处理事件发送,能让请求线程快速结束,同时维护多个长连接的推送逻辑,提升系统并发能力和响应效率。

不使用ExecutorService直接执行的后果

  • 线程池耗尽,系统吞吐量暴跌:每个SSE连接都会占用一个MVC请求线程,直到连接关闭或超时。当并发SSE连接数超过线程池大小,新的HTTP请求会进入等待队列,甚至直接返回服务不可用(503)。
  • 请求线程被长期阻塞:如果发送逻辑包含耗时操作(比如等待数据库查询结果、调用外部接口),请求线程会被持续占用,无法处理其他请求,严重拖慢系统响应速度。
  • 容器强制中断连接:多数Servlet容器(如Tomcat)对请求线程的最大占用时间有默认限制,长时间占用线程会被容器判定为超时,强制中断连接,导致SSE推送意外终止,客户端收到错误。

补充说明

你提供的示例代码中,用Executors.newSingleThreadExecutor()创建独立线程池,就是为了把SSE的发送逻辑从MVC核心线程池中隔离出来,保证核心线程池能处理常规请求,同时异步维护SSE推送。

内容的提问来源于stack exchange,提问作者pixel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:06:02