为了账号安全,请及时绑定邮箱和手机立即绑定

无法使用 Jetty 服务器线程池最大大小限制并发请求,为什么?

无法使用 Jetty 服务器线程池最大大小限制并发请求,为什么?

慕容708150 2023-10-13 10:29:32
我创建了一个带有线程池的 Jetty 服务器来限制对服务器的并发请求数量。但我指定的总请求大小始终比我指定的大小小 5。依赖关系:<dependency>    <groupId>org.eclipse.jetty</groupId>    <artifactId>jetty-server</artifactId>    <version>9.4.6.v20170531</version></dependency>服务器代码:public void httpServer(int port, Handler handler, String name) {    QueuedThreadPool threadPool = new QueuedThreadPool(10);    Server server = new Server(threadPool);    server.setHandler(handler);    HttpConfiguration http = new HttpConfiguration();    ServerConnector serverConnector = new ServerConnector(server, new HttpConnectionFactory(http));    serverConnector.setPort(port);    server.setConnectors(new Connector[]{serverConnector});    try {        log.info(name + " Listener Started on port: " + port);        server.start();        server.join();    } catch (Exception e) {        log.error("Unable to start Server... Exiting");        log.error(e, e);        System.exit(1);    }}处理程序:public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) {    try {        BufferedReader bufferedReader = request.getReader();        String s;        StringBuilder sb = new StringBuilder();        PrintWriter writer = response.getWriter();        while ((s = bufferedReader.readLine()) != null) {            sb.append(s);        }        System.out.println("Got Request");        Thread.sleep(2000);        response.setStatus(HttpServletResponse.SC_OK);        baseRequest.setHandled(true);    } catch (Exception e) {        e.printStackTrace();    }}在上面的代码中,指定的 ThreadPool 大小为 10。但同时我只能创建 5。我尝试将大小更改为 20,但在这种情况下,我可以发出的并发请求始终少 5,即 15。知道在哪里吗?这 5 个线程正在被使用吗?
查看完整描述

1 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

Jetty 不是这样工作的。

线程池不是这样工作的。

Jetty ThreadPool 用于任何需要线程的事情,而不仅仅是请求。

包括 :

  • 低层网络

  • nio选择器

  • 网络接受者

  • http会话维护

  • 部署管理器行为

  • 与凭证提供者合作

  • 内部 http 客户端行为

  • 发送内部请求

  • 异步处理行为

  • http/2 主连接处理(将协议泵送到每个 http/2 会话/流)

  • osgi模块解析

  • 文件系统监控

  • 超时

  • 注释/字节码扫描

  • 代理行为

  • ETC...

对 ThreadPool 的需求会发生变化,具体取决于您使用的功能(servlet、字节码扫描、代理、fastcgi 等)、您使用的技术(例如:http/2、websocket、unixsockets 等),甚至您的机器有多大(你的机器拥有的核心数量,nio本身将需要基于你的机器拥有的核心数量的子集的线程)。

还有一个从任何提供的线程池中取出的“保留线程”切片,用于处理对服务器上的操作至关重要的事情。保留线程的需求可能会在运行时发生变化(如上所述,这也取决于所使用的技术)

如果要限制主动处理的请求数量,请使用QoSFilter针对要限制的 url 模式的配置。(或者DoSFilter如果您有稍微不同的要求,请使用)

不要通过线程池来做到这一点,那是行不通的。


查看完整回答
反对 回复 2023-10-13
  • 1 回答
  • 0 关注
  • 73 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信