【问题标题】:SpringBoot, max number of active SseEmitters?Spring Boot,活动 SseEmitter 的最大数量?
【发布时间】:2021-09-10 01:41:34
【问题描述】:

我在使用 SpringBoot 2.5 应用程序时遇到问题(早期版本中也会出现问题。)基本上,在所有 REST 端点停止响应之前,我只能(非常一致地)调用端点低于 10 次。

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

我在 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;
    }

【问题讨论】:

    标签: java spring-boot server-sent-events


    【解决方案1】:

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

    server.tomcat.max-threads=400

    【讨论】:

    • 谢谢,我试过这个,也设置了一些其他的,但结果是一样的。尽管如此,我似乎确实遇到了一些线程或套接字饥饿问题。有异步线程池在玩吗? server.tomcat.accept-count=100server.tomcat.max-connections=10000server.tomcat.max-threads=400server.tomcat.min-spare-threads=20
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 2017-11-21
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 2022-06-25
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多