4

我需要将调用扩展到 Tomcat,并且建议在内部启动线程。有没有人需要这样做,如果需要,他们想出了什么解决方案?

4

6 回答 6

5

通常不鼓励在应用程序服务器中创建自己的线程,因为服务器应该管理线程以获得更好的可伸缩性。如果容器对线程上下文中可用的内容做出假设,例如安全信息(例如,经过身份验证的主题),您也可能会遇到问题。如果您生成一个线程,然后使用该线程中容器未知的服务器资源,通常会发生这种情况。

检查是否有办法从 Tomcat 获取容器管理的线程。WebLogic 和 WebSphere 支持 commonj.WorkManager,它允许您在容器管理的线程上安排工作。Spring 也可以使用 commonj,但我不确定 Tomcat 是否提供该支持。

于 2008-10-17T13:46:05.397 回答
1

除非您有非常特殊的需要,否则您不应该真正从您的 web 应用程序中启动线程。如果没有关于您的问题的更多详细信息,很难判断这是否是解决您的问题的正确方法。

您可能想看看Quartz,它“是一个功能齐全的开源作业调度系统,可以与几乎任何 J2EE 或 J2SE 应用程序集成或一起使用”。

于 2008-10-17T14:09:49.187 回答
1

你的问题有点含糊。Tomcat 本身已经使用线程池来服务 HTTP 请求。您可以通过 Tomcat 配置增加线程数 - 查看 Tomcat wiki 以获取相关信息。

如果您的意思是在您的代码中要启动线程,那么我建议您仔细阅读 Java 5 中引入的 java.util.concurrent API。另请阅读“Java Concurrency in Practice”,这是有关此主题文本。

于 2008-10-17T13:38:46.767 回答
1

您试图用线程解决的问题是什么?

如果有长时间运行的任务,您应该使用 JMS + 一个完整的 Java EE 容器。

如果您尝试处理过多的负载,您可以考虑两个 tomcat 实例,但是,如果您使用的是 http 会话,则需要调查会话复制。

如果您被迫使用 Tomcat,请考虑在java.util.concurrency.

于 2008-10-17T13:40:46.577 回答
0

托管多线程的 J2EE 抽象是JCA。特别是看一下 WorkManager 和 Work 类。另见这篇文章。Spring 还提供了 JCA 支持的工作管理器抽象。

于 2008-10-17T15:28:34.597 回答
0

正如其他人所问的那样,您应该提供有关您要完成的工作的更多详细信息。

否则,tomcat 使用线程池。增加池中的线程数。使用较新版本的 tomcat -- 6.x。使用 Java 6.0_10。如果需要,请使用分析器调整应用程序并根据需要调整 JVM 设置。

于 2008-10-17T14:49:54.550 回答