Tomcat не может перезагрузить контекст из-за фонового потока - PullRequest
1 голос
/ 29 июля 2011

У меня есть проект JSF2 с Spring. Он разработан на затмении с прикрепленным к нему котом. Это довольно просто и в основном с настройками по умолчанию.

Но у нас есть несколько фоновых потоков, которые выглядят так:

public class CrawlingServiceImpl implements CrawlingService, InitializingBean{
    private final Runnable crawlingRunnable = new Runnable() {
        @Override
        public void run() {
            //...
        }
    };

    public void startCrawling() {
        crawlingThread = new Thread(crawlingRunnable);
        crawlingThread.start();
    }

    public void stopCrawling(){
        if ( crawlingThread!=null )
            crawlingThread.interrupt();
        crawlingThread = null;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        startCrawling();
    }

    public void destroy(){
        stopCrawling();
    }
}

Вот кто вызывает метод destroy():

<bean
    id="crawlingService"
    class="com.berggi.myjane.service.CrawlingServiceImpl"
    autowire="byName"
    scope="singleton"
    destroy-method="destroy"/>

Я знаю, что есть лучший способ сделать все это. Но это не мой код, и я не хочу его переписывать.

Моя проблема заключается в следующем: Когда я меняю класс (каждый раз) или когда я изменяю файл xhtml (очень редко), сервер пытается перезагрузить его, но он терпит неудачу со следующими ошибками:

INFO: Illegal access: this web application instance has been stopped already.  Could not load org.apache.xml.dtm.ref.DTMManagerDefault.  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:1562)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
    at org.apache.xml.dtm.ObjectFactory.findProviderClass(ObjectFactory.java:508)
    ...
    at package.CrawlingServiceImpl.crawl(CrawlingServiceImpl.java:92)
    at package.CrawlingServiceImpl$1.run(CrawlingServiceImpl.java:39)
    at java.lang.Thread.run(Thread.java:680)

Примечание : Проверьте трассировку стека. Есть много этих исключений.

Тогда есть и другие исключения для отсутствующего драйвера jdbc, что совершенно нормально.

Есть идеи?

1 Ответ

0 голосов
/ 28 апреля 2012

Вы уверены, что crawlingThread.interrupt ();убивает работу Нити.

Не видя код запуска ().похоже, у него, вероятно, есть метод crawl, и он делает 1 из 2 вещей

1) цикл, который ожидает, что булева переменная остановит его выполнение, и некоторые возможные сны / ожидания.Я вижу прерывание, но не устанавливается логическое значение для завершения цикла потоков.

2) оно запускается один раз (без цикла), а когда оно завершается, - однако, я не вижу, как прерывание поможет здесь.

Присвоение переменной Thread значения null не поможет уничтожить поток.

Если вы хотите быстрое исправление, вы можете попытаться установить поток в поток демона, чтобы позволить его завершить.

private final Runnable crawlingRunnable = new Runnable() {
    {
        setDaemon(true);
    }

    @Override
    public void run() {
        //...
    }
};
        //...
}

Но без кода я бы предположил, что поток отказывается умирать должным образом из-за проблемы 1 или 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...