Подтвердить что ты не робот

Недопустимый доступ: этот экземпляр веб-приложения уже остановлен

У меня есть класс, который имеет метод init, определенный в 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);
.
.
.

}

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Примерами для этого являются EvictorThread из Apache Commons Pool, который "очищает" объединенные экземпляры в соответствии с конфигурацией пула (max idle и т.д.).

Ответ 3

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

Ответ 4

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