Spring Boot,活动 SseEmitter 的最大数量?

SpringBoot, max number of active SseEmitters?

我 运行 遇到了 SpringBoot 2.5 应用程序的问题(问题也出现在早期版本中。)基本上,我只能(非常一致地)在所有 REST 端点停止之前仅调用端点 10 次以下回应。

在我的原始代码中,我之前有更多代码来跟踪发射器等,但我已将其简化为验证仍能证明问题的最少代码量。这没有任何意义,但似乎该应用程序一次最多只能处理 10 个 SseEmitter。这是一个从服务器向浏览器发送通知的系统,因此 SseEmitter 需要长期存在。

我在 Tomcat 和 Jetty 上都试过了,结果相同。任何见解表示赞赏。

    @GetMapping("/notification/register/{clientId}")
    public SseEmitter register(@ModelAttribute User user, @PathVariable("clientId") String clientId) {
        SseEmitter emitter = new SseEmitter(MINUTES.toMillis(10));
        return emitter;
    }

我认为这是由于您的内部服务器的最大连接数所致,Tomcat 默认情况下应支持最多 200 个连接。 将此添加到您的 application.properties 应该会增加最大数量:

server.tomcat.max-threads=400

我终于发现这是数据库连接未释放回池的问题。

我使用@ControllerAdvice 和@ModelAttribute 使我的自定义用户对象可用于控制器方法。我的实现提供了我们的自定义用户对象,否则只有基本的 Spring 用户对象可用。

似乎只要 SseEmitter 处于活动状态,关联的连接就会一直保持。

解决方案是禁用在视图中打开: spring.jpa.open-in-view=true

这非常难以调试 - Spring 在这种情况下的行为很不幸。