【发布时间】:2014-11-23 22:19:05
【问题描述】:
阅读了很多不同的东西并且对其中一些东西的正确术语并不完全熟悉,我想知道在 tomcat 启动时创建线程的正确方法是什么 特定目的。我用的是linux系统。
我不是想从 servlet 创建线程,而且我很清楚为什么这是不好的。当tomcat启动时,我想要两个具有不同目的的不同线程来启动。第一个线程每隔 30 分钟运行一次,以审核后端数据。第二个线程负责发送电子邮件。当一个请求运行一个必须发送电子邮件的 servlet 时,我不想让 servlet 等待电子邮件发送,而是想向这个电子邮件线程发送一个请求并继续前进。因此,一个定期运行,一个按需运行。我从不需要增加执行这些任务的线程数,我只需要这两个,只要 webapp 正在运行,它就会一直运行,如果 webapp 必须停止,我并不关心优雅关机。
我知道我可以采取以下几种方法:
创建一个在tomcat 外部 运行的进程,并定义一种从我的servlet 与该进程通信的方式。如果可能的话,我想避免这种情况,因为我希望这两个线程首先直接与 webapp 的启动和关闭相关联,并且让它们能够访问
ServletContext中的数据,并且不必通过通信渠道对数据进行 ser/des。在我的一个 servlet 的
init方法中生成两个线程。这看起来很脏而且很老套,但它肯定会完成工作。创建一个扩展
ThreadPoolExecutor或其他ExexutorService的ServletContextListener。这看起来很有吸引力且正确,我想我可以做一个由 2 个线程组成的固定线程池,因为我不再需要了。但这是推荐的方法来做我正在尝试的事情吗?我知道ExecutorService更适合即时执行Runnables,而不必失去创建线程的开销。我不知道这是否完全正确,但如果是,我就不会使用执行程序来达到预期目的。
也许还有更多我不知道的方法,或者实现上述方法之一的正确方法。
【问题讨论】:
-
首先,这与Tomcat无关,请编辑问题。您的问题是如何在 web 应用程序 中启动服务线程。其次,您的第三种方法几乎是正确的-但不要
extends,这肯定是错误的。此外,考虑两个听众,因为它们似乎是独立的关注点,将它们组合在一起也是一种技巧。确保您理解并使用ScheduledExecutorService,并确保您正确关闭了执行程序。 -
听起来你真正想要的是两个Singletons。
-
关于这与tomcat无关,我特别提到tomcat是因为我会尝试在WebSphere中使用
WorkManager做类似的事情,我会将Work传递给它。我不相信 Tomcat 本身具有这种能力(尽管我认为 JBOSS 可能),所以我特别对像 Tomcat 这样的轻量级 servlet 处理器的选项感兴趣。
标签: java tomcat servlets threadpool