在阅读了很多不同的东西并且完全不熟悉这些东西中的正确术语之后,我想知道在创建线程时正确的方式是什么tomcat启动有特定用途。我正在使用一个linux系统。在启动时在tomcat中创建任务线程的正确方法
我不想从一个servlet创建一个线程,并且我对这个不好的原因有个好主意。当tomcat启动时,我想要两个不同的线程有独特的目的开始。第一个线程每隔30分钟运行一次,以审计后端数据。第二个线程负责发送电子邮件。当请求运行一个必须发送电子邮件的servlet时,我不想阻止等待发送电子邮件的servlet,而是要发送一个请求到这个电子邮件线程并继续前进。所以一个定期运行,一个按需运行。我从来不需要增加执行这些任务的线程数,我只需要这两个就可以了,只要webapp正在运行,并且如果webapp必须停止,我就不会在意曼妙关掉。
有我知道我可以采取一些办法:
以外的tomcat创建运行的过程和定义的方式与我的servlet这一进程进行通信。如果可能的话,我想避免这种情况,因为我希望这两个线程首先直接与启动和关闭Web应用程序相关联,并且他们能够访问
ServletContext
中的数据,而不是必须通过通信通道传送/接收数据。在我的一个servlet的
init
方法中产生两个线程。这看起来很肮脏和黑客,但它肯定会完成工作。创建一个
ServletContextListener
,它扩展了ThreadPoolExecutor
或其他ExexutorService
。这似乎有吸引力和正确的,我想我可以做一个固定的2线程线程池,因为我不需要更多。但是,这是推荐的方式来做我想要的吗?据我所知,ExecutorService
实际上更适用于执行Runnable
,而不必失去创建线程的开销。我不知道这是否完全正确,但如果是这样,我不会为了其目的而使用执行者。
也许有更多的方法,我不知道或实现上述之一的正确方法。
首先,**这与Tomcat **无关,请编辑该问题。你的问题是你如何在_web application_中启动服务线程。其次,你的第三种方法几乎是正确的 - 但不要“扩展”,这当然是错误的。另外,考虑两个听众,因为这些听众似乎是各自关心的问题,将他们分组在一起也是一种骇客。确保你理解并使用'ScheduledExecutorService'并确保你正确关闭你的执行程序。 – 2014-09-29 13:45:14
听起来像你真正想要的是两个[Singleton](http://stackoverflow.com/q/70689/823393)s。 – OldCurmudgeon 2014-09-29 14:08:24
关于这个与tomcat无关的问题,我特别提到了tomcat,因为我会尝试在WebSphere中使用'WorkManager'来做这样的事情,并且我会将'Work'传递给它。我不相信Tomcat本身具有这种能力(尽管我认为JBOSS可能),所以我特别对像Tomcat这样的轻量级servlet处理器的选择感兴趣。 – 2014-09-29 18:29:05