繁体   English   中英

由于集群时可能出现的问题,Servlet不应该启动线程......什么问题?

[英]Servlets should not start threads due to issues that may arise when clustering …what issues?

我知道我们不应该在servlet中启动线程,因为线程应该由容器管理。 如果容器被告知关闭,如果有线程,它不知道挂在它周围不会关闭。 我通过使它成为一个守护程序线程来解决这个问题...

但除了上面的“无法关闭”情况之外,还有什么其他原因可能不允许servlet启动线程。 我看到有人提到,如果环境是聚集的,它将导致问题。 但是,没有实际可能会发生的事情可能是不好的。

编辑:目前这是在一个servlet中完成的,我很难说服这段代码的作者不是一个好主意。 一个人必须理解复杂性的论点是不会飞的......我正在寻找一个具体的具体案例,当一些不好的事情发生时,不打算这样做

在我的情况下:有问题的servlet启动了n个线程,这种情况发生在集群上的每个vm中。 没有交易要求

官方常见问题解答

为什么不允许创建和管理线程?

EJB规范为EJB容器分配管理线程的责任。 允许企业bean实例创建和管理线程会干扰容器控制其组件生命周期的能力。 线程管理不是业务功能,它是一个实现细节,通常是复杂的和特定于平台的。 让容器管理线程可以减轻企业bean开发人员处理线程问题的麻烦。 多线程应用程序仍然可行,但多线程控制位于容器中,而不是企业bean中。

也就是说,如果不考虑启动和关闭的问题,那么从某种意义上说,线程是一个实现细节 ,而且多线程被认为是一个可扩展性问题,应该进行管理,这在一定程度上是一个“哲学”问题。通过应用程序。 服务器。

例如,大多数应用程序。 服务器允许集成商定义池并配置线程数等。生成线程的应用程序本身会逃避此配置 ,并且在可伸缩性计划中不能很好地协作。

此外,如果您希望在群集环境中使用单个后台线程 ,则会变得棘手。

最后,应用程序。 服务器控制事务 如果您自己生成线程,则必须注意了解可安全使用的所有详细信息(例如,从池中获取连接)以及如何在必要时使用UserTransaction 我们的想法是,如果您使用应用程序,则不必担心此类细节。 服务器,但如果你自己开始处理线程,你将需要。

然而,我看到Web应用程序从ServletContextListener一个后台线程,猜猜是什么,这很好,即使应用程序部署在多个节点上也是如此。 您只需要了解运行多个JVM意味着什么,并确保您正确支持它。

根据您的使用情况,有很多问题。 如果您的线程/作业正在运行的群集中的特定服务器崩溃,这会使您的线程消失,那会是一件坏事吗? 是否应该通知某人? 作业应该转移到群集中的另一台服务器吗? 一旦服务器再次启动,它应该重新启动吗? 所有这些,你必须在你的线程中实现....或者你可以使用JMS,它甚至可以在Tomcat中运行,使用ActiveMQ的插件,或者你选择的其他一些消息容器,然后编写代码执行你的逻辑,让容器担心所有其余的。 因人而异

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM