使用Tomcat在应用程序代码中配置执行程序?

时间:2012-03-12 16:14:30

标签: tomcat tomcat6 executorservice

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

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

2 个答案:

答案 0 :(得分:1)

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

server.xml中的Executor元素定义了一个在 Tomcat的组件之间共享的ThreadPool,如连接器,调度程序等(例如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行为进行全面的程序控制,您最好使用嵌入式Tomcat并独立运行您的应用程序(例如Liferay Portal)。见这里:http://tomcat.apache.org/download-70.cgi#7.0.26

答案 1 :(得分:1)

为什么我们要害怕而不使用tomcat执行者?

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

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

所以从webapp,我们如何访问servlet容器使用的执行器,如tomcat?

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