当前位置: 代码迷 >> J2EE >> Tomcat的request超时处理,该如何处理
  详细解决方案

Tomcat的request超时处理,该如何处理

热度:24   发布时间:2016-04-17 23:12:12.0
Tomcat的request超时处理
在Tomcat中,每个request请求都会分到一个线程去处理。如果request处理时间太长了(超时),Tomcat会怎么处理这个线程呢?
我baidu了一下,没有找到想要的答案,看Tomcat源码又太费劲,所以请教一下大神们
------解决思路----------------------
你可以看看tomcat的底层,其实他就是将http的协议规范实现了。http的底层当然也是tcp/ip的编程,当浏览器将请求发给tomcat的时候,当然既然其协议的底层是socket,tomcat也就会根据其配置的port,如8080.绑定监听。当收到请求的时候,将其按http协议标准封装成了HttpRequest的对象,交给我们做业务逻辑的处理。以下估计是楼主想知道的事情。对于任意一个网络服务器来说,不管是tomcat之类的web服务器,还是如proftpd之类的ftp服务器,或者是mysqld之类的mysql服务端。肯定都会有线程池这个概念的。会初始开几个handler的线程。这个线程数一般更多的会参考比如cpu的核心数,当然还有就是你程序的io情况,比如更常用的是cpu核心数的两倍或者是cpu核心数+1.不论如何每一个连接请求过来它会先找线程池中是否有初始出来空闲的线程,这个一般会放在诸如栈之类的数据结构中,有的话取出做请求处理。没有的话开启一个新的线程来处理。当请求结束的时候它会先看是否有连接请求在排队(消息队列),有的话将当前线程分配处理新的请求。没有的话如果其大于我们的默认的初始值(如cpu核心数+1),那么我们将线程生命周期结束。当然了如果楼主有兴趣可以学学windows的iocp和linux的epoll这两种目前在各自操作系统中最高效的socket模型。自jdk4以后,java开始出现nio的概念。这个n可以理解为new也可以理解为non-block,在tomcat7中据说已经有nio的配置,而nio的底层在windows上会选择iocp模型,linux上会选择epoll模型。java的io能力也提高了很多。
------解决思路----------------------
引用:
Quote: 引用:

你讲的很详细,谢谢了 :)
我现在的问题是,Tomcat是如何处理超时的线程的。想JDK的线程池,一旦submit之后就不管了,如果有future返回,也只是监听一下,即使超时了,也不会去管。
所以我就是想指导tomcat是如何处理线程超时的。否则线程池的资源只会越来越少!


这你真就得自己进源码看看啦 作为程序员我感觉如果有这样的激情不去探究真的很难成为一名优秀的程序员吧 当然我这里以前也有用自己编译的tomcat7,帮你进去大概看了看 顺便说句你真的该自己去探索这样的问题 别人说再多也没用自己探索得来的那样充实 收获大。因为tomcat的源码是ant管理的 你只要用ant编译一下就ok啦。你可以通过调试的方式,然后查看其调用堆栈,很容易发现ThreadPoolExecuter这个类,因为工作忙的原因,我也没仔细看 你可以进去看看 我觉得这是任何人都不应该代替你的地方。我吧它的注释贴出来 看看你应该也大体明白了

If the pool currently has more than corePoolSize threads,
 * excess threads will be terminated if they have been idle for more
 * than the keepAliveTime (see {@link
 * ThreadPoolExecutor#getKeepAliveTime}). This provides a means of
 * reducing resource consumption when the pool is not being actively
 * used. If the pool becomes more active later, new threads will be
 * constructed. This parameter can also be changed dynamically using
 * method {@link ThreadPoolExecutor#setKeepAliveTime}. Using a value
 * of <tt>Long.MAX_VALUE</tt> {@link TimeUnit#NANOSECONDS} effectively
 * disables idle threads from ever terminating prior to shut down. By
 * default, the keep-alive policy applies only when there are more
 * than corePoolSizeThreads. But method {@link
 * ThreadPoolExecutor#allowCoreThreadTimeOut(boolean)} can be used to apply
 * this time-out policy to core threads as well, so long as
 * the keepAliveTime value is non-zero.

从这里也可以看出 超时的线程肯定会被回收掉呢 要不然你想想也清楚win32最大理论支持的4G内存寻址空间,即便一个线程开销2M,最多也就2000个线程。加上线程的上下文就切换,时间,空间的浪费是可想而知的。你再怎么开线程也不可能让你超过最大线程数呢
------解决思路----------------------
没发现tomcat哪里可以设置超时,怀念用asp时候,在iis里设置一下脚本超时就万事大吉

一个请求处理的时候,如果某些原因导致页面执行了很长时间,应该是不可以接受的,一个网页2秒没响应果断关闭,tomcat不提供这样的设置莫非要写代码的时候,每写一行检测一下是否执行超过了时间,还是自己开个线程计时?我也有和楼主一样的疑惑,顶起来坐等大牛回答

刚刚学习servlet3.1中的异步处理,传说性能有很大提升,超时也可以直接设置。写代码时却发现超时后异步线程没有被中断,检查Thread.currentThread().isInterrupted()返回false,tomcat不发中断信号,莫非要我自己去弄么,百度搜索到这里,崩溃中。。。

大牛们是怎么处理页面执行超时的,坐等回答
------解决思路----------------------
web容器线程被大量长时间占用,就会出现服务阻塞的情况。访问会非常不顺畅,甚至出现等待的情况,关注服务器日志。
  相关解决方案