【问题标题】:Servlets should not start threads due to issues that may arise when clustering ....what issues?由于集群时可能出现的问题,Servlet 不应启动线程......什么问题?
【发布时间】:2011-03-24 09:51:48
【问题描述】:

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

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

编辑: 目前这是在一个 servlet 中完成的,我无法说服该代码的作者,这不是一个好主意。一个人必须了解复杂性的论点是不会成立的…… 我正在寻找一个可能发生坏事的具体具体案例,但并不打算这样做

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

【问题讨论】:

    标签: java multithreading jakarta-ee servlets cluster-computing


    【解决方案1】:

    来自official FAQ

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

    EJB 规范分配给 EJB容器的职责 管理线程。允许企业 要创建和管理的 bean 实例 线程会干扰 容器控制它的能力 组件的生命周期。线 管理不是业务功能, 它是一个实现细节,并且是 通常复杂且 特定于平台。让 容器管理线程减轻了 企业 bean 交易开发者 有线程问题。多线程 应用程序仍然是可能的,但 多线程的控制位于 在容器中,而不是在 企业 bean。

    也就是说,如果不考虑启动和关闭的问题,从线程是一个实现细节的意义上说,部分是一个“哲学”问题,也是多线程的事实被视为可扩展性问题,应由应用程序管理。服务器。

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

    此外,如果您希望在集群环境中使用单个后台线程,那就很棘手了。

    最后是应用程序。服务器控制交易。如果您自己生成线程,则必须注意了解可以安全使用或不安全使用的所有细节(例如,从池中获取连接)以及如何在必要时使用UserTransaction。这个想法是,如果您使用应用程序,您不应该担心这些细节。服务器,但如果您开始自己处理线程,则需要这样做。

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

    【讨论】:

    • 你说:单后台线程。我假设它是“集群环境中的单例”问题的一个具体案例。也没有交易要求...
    • OP 询问的是 servlet,而不是 EJB。
    • @Raedwald 没关系。出于同样的原因,Servlet 和 EJB 不应启动线程。
    【解决方案2】:

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

    【讨论】:

    • 这是一个很好的观点:这些线程根据应用程序状态生成图像并通过网络发送到其他地方。因此,如果服务器崩溃并重新启动,我认为线程只是死了,工作就会丢失。这很重要,因为这种图像生成和发送只能发生一次。正如您所说,servlet 可以将 JMS 消息发送到 MDB 以开始工作。当服务器崩溃时它的行为如何?
    • 取决于您如何设置消息队列,假设您的用例对队列最满意,并且如果您在集群中有多个服务器,那么如果 1 个服务器崩溃,故障转移服务器可以重新生成图像,等待某些东西来获取它,或者它可以丢弃它,以最适合您的情况为准。
    猜你喜欢
    • 1970-01-01
    • 2017-05-26
    • 2019-08-26
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多