使用Tomcat,您可以设置acceptCount值(默认为100),这意味着当所有工作线程都忙时,新连接将被放置在队列中(直到队列已满,此后它们将被拒绝)。
我想要的是监视此队列中项目的大小 - 但我无法确定是否有一种通过JMX获取它的方法(即不是队列最大大小 - 那只是配置,而是当前项目数量在队列中)。
欢迎任何想法。
Tomcat的配置:http://tomcat.apache.org/tomcat-6.0-doc/config/http.html(搜索“acceptCount”)
使用Tomcat,您可以设置acceptCount值(默认为100),这意味着当所有工作线程都忙时,新连接将被放置在队列中(直到队列已满,此后它们将被拒绝)。
我想要的是监视此队列中项目的大小 - 但我无法确定是否有一种通过JMX获取它的方法(即不是队列最大大小 - 那只是配置,而是当前项目数量在队列中)。
欢迎任何想法。
Tomcat的配置:http://tomcat.apache.org/tomcat-6.0-doc/config/http.html(搜索“acceptCount”)
根据邮件列表上的线程和Charles的回复,没有这样的JMX存在。
Chuck说:“请注意,由于接受队列是由操作系统的通信堆栈维护的,因此Tomcat看不到它。”
David说:"不幸的是,由于Tomcat对接受队列中的请求一无所知,..."
没有办法获取此信息(接受队列中有多少请求?)吗?
没有,接受队列完全不可见。只有通信堆栈知道其中的内容,并且我不知道任何可以排队内容的API,因为内容尚未接收,只有连接请求。
根据您实际的问题(即测量Tomcat尚未开始处理的接受队列中的请求),如果您正在寻找“限流解决方案”,请参阅同一线程的后续讨论。
无法监视接受队列,但您可以使用Executor获取Tomcat排队请求的数量。
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="20" minSpareThreads="10" maxQueueSize="30" />
<Connector port="8080" protocol="HTTP/1.1" executor="tomcatThreadPool" connectionTimeout="20000" redirectPort="8443" maxConnections="50" />
配置 maxThreads="20" 表示线程池最多有20个工作线程,可以同时处理20个请求。
maxQueueSize="30" 表示线程池可以最多排队30个未处理的请求。因此,您可以通过 JMX 监控队列大小属性,获得排队请求的数量。
但默认情况下,线程池队列将不会持有任何请求,因为 maxConnections 的默认值是 maxThreads 的值,这意味着当所有工作线程都忙碌时,新请求将在接受队列中排队。
通过设置 maxConnections="50",Tomcat 可以接受比 maxThreads(20) 更多的请求。在上面的示例中,Executor 线程池可以处理20个请求,额外的30个请求将保留在线程池队列中,更多的请求将进入接受队列排队。
因此,现在您可以通过 MBean 'Catalina:type=Executor,name=tomcatThreadPool' 和属性名称 'queueSize' 监视线程池中排队的请求数量。