关于tomcat4并发处理的思考:
1、 首先看一下server.xml文件关于并发的配置
<Connector className="org.apache.catalina.connector.http.HttpConnector" port="8080" minProcessors="5" maxProcessors="10" enableLookups="true" redirectPort="8443" acceptCount="2" debug="3"/> |
Tomcat默认打开的并不是这个连接器,所以如果想要使用HttpConnector这个连接器需要把这个注释打开,并且端口号不要发生冲突。
这几个参数简单介绍一下:
Connector(表示客户端和service之间的连接) | port | 指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求 |
minProcessors | 服务器启动时创建的处理请求的线程数 | |
maxProcessors | 最大可以创建的处理请求的线程数 | |
enableLookups | 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址 | |
redirectPort | 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号 | |
acceptCount | 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理 | |
connectionTimeout | 指定超时的时间数(以毫秒为单位) |
对于这几个参数在程序中的表现,下面一一进行列举:
1、 minProcessors 和maxProcessors
服务器启动时,首先会创建minProcessors个处理请求的线程,供客户端发送请求进行使用。
while (curProcessors < minProcessors) { if ((maxProcessors > 0) && (curProcessors >= maxProcessors)) break; HttpProcessor processor = newProcessor(); recycle(processor); } |
将创建出来的线程放到Stack的数据结构里。
private HttpProcessor createProcessor() {
synchronized (processors) { if (processors.size() > 0) { // if (debug >= 2) // log("createProcessor: Reusing existing processor"); return ((HttpProcessor) processors.pop()); } if ((maxProcessors > 0) && (curProcessors < maxProcessors)) { // if (debug >= 2) // log("createProcessor: Creating new processor"); return (newProcessor()); } else { if (maxProcessors < 0) { // if (debug >= 2) // log("createProcessor: Creating new processor"); return (newProcessor()); } else { // if (debug >= 2) // log("createProcessor: Cannot create new processor"); return (null); } } }
} |
2、 acceptCount
factory.createSocket(port, acceptCount)
public ServerSocket createSocket (int port, int backlog) throws IOException, KeyStoreException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, KeyManagementException {
return (new ServerSocket(port, backlog));
} |
3、 connectionTimeout
if (connectionTimeout > 0) socket.setSoTimeout(connectionTimeout); socket.setTcpNoDelay(tcpNoDelay); |
刚开始server.xml中minProcessors=”5”,maxProcessors=”10”,acceptCount=”2”
从客户端发送请求,对请求数进行统计:
请求数 | 为处理请求创建线程数 |
23 | 10 |
13 | 6 |
看了一周有关acceptCount与maxProcessors,越看越迷,并发处理和我想的与配置出来的总是不一样啊,为什么呢?先记录一下