Нелегальный доступ: этот экземпляр веб-приложения уже остановлен - PullRequest
19 голосов
/ 09 февраля 2011

У меня есть класс, в котором метод init определен в xml

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

myClass:

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

}

Не знаю почему, есть идеи?

Ответы [ 4 ]

26 голосов
/ 10 февраля 2011

Проблема решена после перезапуска Tomcat и Apache, Tomcat кеширует старую версию приложения.

9 голосов
/ 06 января 2017

Короче говоря: это может произойти, когда вы активно развертываете веб-приложения. Например, ваш сервер ide + development снова развернул войну. Потоки, которые были созданы ранее, все еще работают. Но в то же время их загрузчик классов / контекст недопустим и сталкивается с IllegalAccessException / IllegalStateException, поскольку его исходное веб-приложение (бывшая среда выполнения) было повторно развернуто.

Итак, как говорится здесь, перезапуск не решает эту проблему навсегда. Вместо этого лучше найти / реализовать управляемый пул потоков, s.th. как это, чтобы соответственно обработать завершение потоков. В JavaEE вы будете использовать эти ManagedThreadExeuctorServices. Аналогичное мнение и ссылка здесь .

Примерами этого является EvictorThread из пула Apache Commons, который «очищает» экземпляры пула в соответствии с конфигурацией пула (максимальное время простоя и т. Д.).

8 голосов
/ 09 февраля 2011

Я подозреваю, что это происходит после попытки удалить ваше приложение.Вы когда-нибудь убивали тот поток , который вы инициализировали во время процесса init()?Я бы сделал это в соответствующем методе destroy().

0 голосов
/ 25 июня 2019

Я столкнулся с этой проблемой при остановке Apache Tomcat и отредактировал ее, удалив все проекты на Apache.

...