我将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)

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

任何指针都将非常有帮助。

最佳答案

这听起来很像是您自己创建线程-通常在应用程序服务器环境中引起人们的注意。有多种方法可以缓解这种情况-一种对当前(隐含)体系结构影响最小的方法是,当您取消部署Web应用程序时,需要线程停止。我假设这不是“部署时”发生的,而是“取消部署后”发生的,因为您正在ServletContextListener中启动线程,但永远不会停止它们。

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

10-04 23:14
查看更多