如何在部署liferay portlet之前终止所有线程

时间:2015-07-13 15:11:13

标签: java multithreading liferay liferay-6

我正在使用Liferay 6.2和使用ServletContextListener创建的线程。

因此,当我尝试部署此特定的portlet应用程序时,它会给我以下错误 -

INFO: Illegal access: this web application instance has been stopped already.  Could not load com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
    at javax.xml.parsers.FactoryFinder.getProviderClass(FactoryFinder.java:112)
    at javax.xml.parsers.FactoryFinder.newInstance(FactoryFinder.java:178)
    at javax.xml.parsers.FactoryFinder.newInstance(FactoryFinder.java:147)
    at javax.xml.parsers.FactoryFinder.find(FactoryFinder.java:265)
    at javax.xml.parsers.DocumentBuilderFactory.newInstance(DocumentBuilderFactory.java:121)
    at com.h5g.deployment.util.DeploymentUtil.getLobbyBranch(DeploymentUtil.java:642)
    at com.h5g.deployment.service.ClientStatusCheckTask.call(ClientStatusCheckTask.java:47)
    at com.h5g.deployment.service.ClientStatusCheckTask.call(ClientStatusCheckTask.java:1)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

在自动部署开始之前,我一直在寻找一种杀死线程的方法。

任何指针都会非常有用。

2 个答案:

答案 0 :(得分:3)

这听起来很像你自己创建线程 - 这通常会在应用服务器环境中引起人们的注意。有几种方法可以缓解这种情况 - 对当前(隐含)架构影响最小的方法是,当取消部署 Web应用程序时,需要停止线程。我假设在部署"时没有发生这种情况,而是在取消部署后#34;"因为你在ServletContextListener开始你的线程,但永远不会阻止他们。

当应用程序关闭时,ServletContextListener会收到通知,这可以用来将其状态标记为您生成的线程。在典型的无限循环中,线程会经常检查它们是否仍然应该运行 - 如果它们不应该,只是退出无限循环并且它们将在它们后面进行精美清理。重新部署应用程序后,新的ServletContextListener将生成新线程。

答案 1 :(得分:0)

尝试使用for:

停止线程
thread.interrupt();

但我不确定我是否需要查看启动线程的代码