非法访问:此Web应用程序实例已被停止

问题描述 投票:0回答:7

我有一个类,它在 xml 中定义了 init 方法

<bean id="appStarter" class="com.myapp.myClass" init-method="init" destroy-method="destroy"/>

我的班级:

public class myClass{

    private Thread t;

    public void init() {

             t = new Thread() {

                @Override
                public void run() {
                    while (true)
                        try {
                            doStuff();
                            Thread.sleep(1000);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                }

            };
            t.start();
        }

public void destroy() {
        t.interrupt();
    }

}

当应用程序启动时,这些线程运行良好,一切都正常 一段时间后我得到以下异常。

INFO: Illegal access: this web application instance has been stopped already.  Could not load com.sun.mail.imap.IMAPStore.  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:1273)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
    at javax.mail.Session.getService(Session.java:755)
    at javax.mail.Session.getStore(Session.java:569)
    at javax.mail.Session.getStore(Session.java:531)
    at javax.mail.Session.getStore(Session.java:510)

在doStuff方法中:

public void doStuff(){

Session sessioned = Session.getDefaultInstance(System.getProperties(),
                null);
        Store store = sessioned.getStore("imap");
        store.connect(hostName, userName, password);
.
.
.

}

我不知道为什么,有什么想法吗?

java multithreading tomcat jakarta-ee jakarta-mail
7个回答
44
投票

重新启动tomcat和apache后问题解决,tomcat正在缓存旧版本的应用程序。


22
投票

简而言之:当您热部署 Web 应用程序时,很可能会发生这种情况。 比如你的ide+开发服务器又热部署了一场战争。之前创建的线程仍在运行。但与此同时,它们的类加载器/上下文无效并面临 IllegalAccessException / IllegalStateException,因为其原始 Web 应用程序(前运行时环境)已被重新部署。

因此,正如此处所述,重新启动并不能永久解决此问题。相反,最好找到/实现一个托管线程池,等等。像这样适当地处理线程的终止。在 JavaEE 中,您将使用这些 ManagedThreadExeuctorServices。 这里有类似的意见和参考

这方面的示例是 Apache Commons Pool 的 EvictorThread,它根据池的配置(最大空闲等)“清理”池化实例。


8
投票

我怀疑这是在尝试取消部署您的应用程序后发生的。您是否曾经“杀死”在“init()”过程中初始化的线程?我会在相应的

destroy()
方法中执行此操作。
    


2
投票

我在使用动态 Jasper 报告时遇到了同样的错误,当我部署我的应用程序首次用于创建报告时,报告创建工作正常,但是一旦我将一些代码更改热部署到服务器,我就收到了此错误.


2
投票

更新:

您也可以尝试查找后台是否有正在运行的tomcat进程并将其杀死。


0
投票

[废弃的连接清理线程] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading 非法访问:此 Web 应用程序实例已停止。无法加载[]

该错误是因为有两个不同的java版本引起的。我在eclipse中的开发环境设置为jdk-15,生产服务器运行版本11。

为了解决这个问题,在 eclipse 中,即使使用 jdk-15,我也模拟了 java-11:


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.