我有一个创建了大量守护程序线程的应用程序,我希望每个应用程序关闭时关闭它们。
我有点担心Websphere 7可能没有关闭它们。
有人知道Websphere 7是否以不同方式处理Daemons线程? (我知道应该这样做)
注意: 我知道什么不应该手动创建线程,我应该使用WebSphere WorkManager或其他东西,但这个应用程序必须在Tomcat和WebSphere中运行。
我知道我应该将所有线程绑定到某个上下文/关闭机制,这正在进行中。
答案 0 :(得分:4)
每个WAS服务器运行一个JVM,守护程序线程与JVM的生命周期相关联,而不是应用程序的生命周期。因此,您不应期望在应用程序停止时关闭任何守护程序线程。
正如您已经指出的那样,您不应该手动创建线程; Java EE规范禁止这样做,并且Java EE容器中的行为与您已经找到的独立Java应用程序不同。不幸的是,目前没有WorkManager等效的Java EE标准;但是,JSR-236(Java EE的并发实用程序)可能会作为候选者返回Java EE 7。
与此同时,在WAS上,您可以使用asynchronous beans(WorkManager
)。我们已成功使用此方法将线程绑定到应用程序生命周期。
但是,由于您还需要在另一个容器(Tomcat)中运行,因此可能还有其他一些选项需要考虑在您的应用程序中处理并发:
ServletContextListener
加入网络应用生命周期处理并发性的其他一些可能选项包括以下内容,但这些选项需要EJB,这些可能在Tomcat中不可用:
以下是Java EE中并发主题的一些相关主题:
答案 1 :(得分:1)
正如已经提到过的,你不应该这样做,但是没有一个好方法可以做到这一点。这对我没有造成任何问题。
这种方法需要集中创建线程,并在应用程序停止时使用侦听器来终止线程。
你必须做一些事情:
答案 2 :(得分:0)
Websphere只是一个java应用程序。它不能尊重或不尊重作为JVM或Java运行时环境特征的deamon线程。因此,如果您在Java EE应用程序中创建deamon线程,它将在每个应用程序服务器中都是deamon。
此外据我所知,即使您创建常规线程也不会阻止应用服务器关闭:每个应用服务器的关闭机制都会尝试关闭其所有组件,并最终运行System.exit()
以赢取犯罪分子:)手动打开线程。