[英]Cannot limit concurrent request with Jetty Server Thread Pool max size, why?
我創建了一個帶有線程池的 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 個線程正在使用嗎?
碼頭不是那樣工作的。
ThreadPools 不是那樣工作的。
Jetty ThreadPool 用於任何需要線程的事情,而不僅僅是請求。
那包含着:
對 ThreadPool 的需求會根據您使用的功能(servlet、字節碼掃描、代理、fastcgi 等)、使用的技術(例如:http/2、websocket、unixsockets 等)甚至您的機器有多大而變化(您的機器擁有的核心數量,nio 本身將需要基於您機器擁有的核心數量的子集的線程)。
還有一個“保留線程”切片從任何提供的 ThreadPool 中取出來處理對服務器上的操作至關重要的事情。 保留線程的需求可能會在運行時發生變化(如上,它還取決於使用的技術)
如果要限制正在處理的主動請求的數量,請使用針對要限制的 url 模式配置的QoSFilter
。 (或者如果您的要求略有不同,請使用DoSFilter
)
不要通過 ThreadPool 來做,那永遠不會起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.