【问题标题】:Illegal access: this web application instance has been stopped already非法访问:此 Web 应用程序实例已被停止
【发布时间】:2011-06-24 03:04:48
【问题描述】:

我有一个在 xml 中定义了初始化方法的类

<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);
.
.
.

}

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

【问题讨论】:

  • 也许你可以尝试在你的destory事件中添加一些释放函数调用(只是链接Singleton,连接池)。

标签: java multithreading tomcat jakarta-ee jakarta-mail


【解决方案1】:

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

【讨论】:

  • 我怎样才能永久解决这个问题?这个问题的根本原因是什么?因为它使我的生产应用程序崩溃。我不想一直重启服务器...需要帮助。
  • 可以解决这个问题,重启Tomcat就解决了。
  • 这可能是一个热部署问题 + 已经启动的线程,可能不是自己的线程,而是来自 3rd 方库。 See my answer here.
  • @JensKreidler:我怎么知道是哪个 3rd 方线程导致了这个问题?
  • 我使用 jvisualvm 工具查看了我的应用程序并调查了实例和线程
【解决方案2】:

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

因此,正如此处所述,重新启动并不能永久解决此问题。相反,最好找到/实现一个托管线程池,s.th。像这样适当地处理线程的终止。在 JavaEE 中,您将使用这些 ManagedThreadExeuctorServices。 A similar opinion and reference here.

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

【讨论】:

    【解决方案3】:

    我怀疑这是在尝试取消部署您的应用后发生的。您是否曾经在init() 过程中初始化过kill off that thread?我会在相应的destroy() 方法中执行此操作。

    【讨论】:

    • 对了,是卸载后出现的,我不杀这个线程,怎么办,请指教?
    • 好的,经过一番搜索,我对代码进行了一些更改,但仍然出现相同的错误,您能看看上面代码中的更改吗?
    • 即使我在destroy方法中使用了中断,仍然得到同样的异常
    • 您不需要按照该链接处理 InterruptedException 并退出吗?
    • 即使在处理它时,问题仍然存在,我注意到原因是在应用停止时没有执行destroy方法?而且即使应用程序停止,线程仍然运行,这很奇怪,我不知道为什么?
    【解决方案4】:

    重启你的服务器可以解决这个问题。

    我在使用动态 Jasper 报告时遇到了同样的错误,当我部署我的应用程序以首次用于创建报告时,报告创建工作正常,但是一旦我对服务器进行了一些代码更改的热部署,我得到了这个错误。

    【讨论】:

      【解决方案5】:

      如果是从 IDE 启动的本地开发 tomcat,那么重启这个 IDE 并重建项目也有帮助。

      更新:

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

      【讨论】:

        【解决方案6】:

        我有这个确切的错误。我的应用程序在 eclipse 开发环境中运行良好,但是当部署到生产 Tomcat 服务器时,应用程序会正常加载,然后当调用端点时,它会产生错误:

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

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

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

        【讨论】:

          猜你喜欢
          • 2016-12-11
          • 1970-01-01
          • 1970-01-01
          • 2013-03-09
          • 1970-01-01
          • 2011-07-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多