我有一个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驱动程序这是绝对罚款例外。
任何想法?
我硬着头皮重写。这是在Java EE Web应用程序中运行后台进程的一种非常糟糕的方式。 – BalusC
我必须与同事讨论。顺便说一句,用JSF和Spring实现后台作业的更好方法是什么? – mist