2012-03-12 71 views
0

Tomcat(6)允许在server.xml中的Executor元素中定义线程池。是否可以在应用程序代码中使用ExecutorService这样的线程池?当然,我可以在Servlets/ServletContextListener/Spring /中创建自己的线程池,但是在部署描述符中配置线程数等等对我来说似乎更好。在应用程序代码中使用Tomcats配置的执行程序?

更新:我的想法是配置一个单独的执行程序元素,只在应用程序内使用此线程池,但不在tomcats自己的组件中。这样它可能不会干扰tomcat本身。

回答

1

您的问题似乎有点不清楚......

server.xml中执行人元素定义whitch是其中Tomcat的组件共享,如连接器,调度程序等一个线程池(例如HTTP连接) 。最好不要将自己的任务添加到服务器内部的ThreadPool中,否则可能会危及服务器的稳定性,并且会“硬连线”到Tomcat xy。

如果想让Tomcat来控制你自己的线程池的线程,可以说你有开发的创新一个Tomcat和一个生产模式不同的核心池大小,你可以在服务器端配置的上下文参数做到这一点:

在server.xml中:

<server> 
    ... 
    <host ...> 

    <Context docBase="MyApp" path="/MyApp" reloadable="true"> 
     <Parameter name="numberOfThreadsOnThisTomcat" value="50"/> 
    </Context> 

    </host> 
</server> 

检索值在你的应用程序使用:

getServletContext().getInitParameter("numberOfThreadsOnThisTomcat") 

欲了解更多信息看看这里:http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Context_Parameters

请记住,这个参数可能不会自动部署后存在。

如果您想对您进行完整的程序控制Tomcats的行为,您可以更好地使用Embedded Tomcat并运行您的应用程序(例如Liferay Portal)。看到这里:http://tomcat.apache.org/download-70.cgi#7.0.26

+0

我的想法是配置一个额外的Executor元素,而不是在tomcat组件中使用它,而只在应用程序中使用它来执行后台任务。这样的应用程序不能妥协的tomcats稳定性,可以吗? – 2012-03-13 08:05:19

0

为什么我们应该害怕,不要使用tomcat执行器?

它被称为执行者!不是别的。理想情况下,一旦将ExecutorService配置为CPU内核的数量,那么如果所有代码都处于异步模式,则所有程序都应该使用相同的执行程序服务。鉴于并非所有的代码都处于异步模式,因此相对于CPU内核使用更大的数字。无论如何,每个组件都无法使用自己的执行程序服务。

你多久写一段带死循环的代码?

因此,从webapp中,我们如何访问servlet容器所使用的执行程序,如tomcat?

一个解决方案应该指定一个自定义执行程序并替换server.xml中的默认org.apache.catalina.core.StandardExecutor,然后即使通过一个静态变量,webapps也可以访问它,因为该执行程序是自定义的。