2011-07-29 43 views
1

我有一个Spring的JSF2项目。它是在附有tomcat的eclipse上开发的。这是非常简单的,主要是默认设置。因为后台线程,tomcat无法重新加载上下文

但是,我们有看起来像这样的一些后台线程:

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驱动程序这是绝对罚款例外。

任何想法?

+3

我硬着头皮重写。这是在Java EE Web应用程序中运行后台进程的一种非常糟糕的方式。 – BalusC

+0

我必须与同事讨论。顺便说一句,用JSF和Spring实现后台作业的更好方法是什么? – mist

回答

0

你确定crawlingThread.interrupt();正在杀死线程的运行。

没有看到run()的代码。它看起来像它可能有一个方法叫抓取和它1 2的东西

1)一个循环需要一个布尔变量来阻止它运行,而有些可能睡觉/等待。我看到一个interupt,但没有设置布尔值来终止线程循环。

2)运行一次(无环),完成模具的时候 - 但是,我没有看到interupt将如何帮助这里。

分配线程变量设置为null会不由自主地杀死线程。

,如果你想速战速决,你可以尝试线程设置为守护线程允许它被终止。

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

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

但是,如果没有代码,我猜线程被拒绝正确死于任何问题1或2

相关问题