亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法使用 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 關注
  • 161 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號