2011-07-29 11 views
1

私はSpringでJSF2プロジェクトを持っています。それはそれに付随する風猫と日食で開発されています。これはかなり単純で、ほとんどの場合デフォルト設定です。バックグラウンドスレッドのためTomcatがコンテキストをリロードできない

しかし、我々は次のようになり、いくつかのバックグラウンドスレッドを持っている:私はこのすべてを可能にするより良い方法があることを知っている

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

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()メソッドを呼び出している人です完了しました。しかし、これは私のコードではなく、私はそれを書き直したくありません。

私の問題は以下の通りです:

: を私は(毎回)クラスを変更したりすると、私は(非常にまれ)サーバは、それをリロードしようとするが、それは次のエラーで失敗した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()のコードは表示されません。それはおそらくクロールと呼ばれる方法があり、2つのうちの1つを実行するように見えます。

1)ブール変数が実行を停止し、いくつかの可能なスリープ/ウェイトを期待するループ。私はinteruptが見えますが、booleanはスレッドループを終了するように設定されていません。

2)これは1回(ループなし)実行され、終了すると死ぬが、ここでは干渉がどのように役立つかわかりません。

スレッド変数をnullに割り当てることは、スレッドを強制終了するのに役立ちません。

クイックフィックスが必要な場合は、スレッドをデーモンスレッドに設定して終了させることができます。

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

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

しかし、コードなしで、私は、スレッドが原因問題1または2

関連する問題