2012-09-25 55 views
0

我的應用程序中實現了一個任務調度器。基本上,我所做的是安排一些任務在一天內執行4次(如6小時內執行6次),因此係統會將其安排到:00:00,06:00,12:00,18:00。WebappClassLoader.loadClass中的非法訪問

好吧,我有一個擴展了Thread類的類(FlowJobController),並且在run()實現中,我一直在60到60秒內休眠線程,因此它會再次執行以檢查是否有任何要執行的任務。如果屬實,我運行我的工作。

基本上主要部分它:

rSet = pStmt.executeQuery(); 
while (rSet.next()) { 
    long jobId = rSet.getLong("trf_codigo"); 
    String ruleName = rSet.getString("reg_nome"); 
    String ruleParameters = rSet.getString("trf_regra_parametros"); 

    Job job = new Job(); 
    job.setId(jobId); 
    job.setRuleName(ruleName); 
    job.setParameters(Functions.stringToList(ruleParameters, "\n")); 

    FlowJob flowJob = new FlowJob(this, job); 
    flowJob.start(); 
} 
} catch (Exception ex) { 
logger.error(WFRSystem.DEFAULT_USER, system.getCode(), ex); 
} finally { 
    try { 
    DBConnection.close(pStmt); 
    DBConnection.close(rSet); 

    // executede 60 in 60 sec 
     Thread.sleep(60 * 1000); 
    } catch (InterruptedException ex) { 
     logger.error(WFRSystem.DEFAULT_USER, system.getCode(), ex); 
    } 
} 

的事情是:當pStmt.executeQUery()返回將要執行的記錄,它進入而並出現進行錯誤:Job job = new Job();

錯誤是:

Exception in thread "FlowJobController" java.lang.NoClassDefFoundError: wfr/com/Job 
at wfr.com.FlowJobController.run(FlowJobController.java:112) 

這個錯誤之前,我得到這個錯誤:

25/09/2012 12:00:09 org.apache.catalina.loader.WebappClassLoader loadClass 
INFO: Illegal access: this web application instance has been stopped already. Could not load wfr.com.Job. 

最終的跟蹤堆棧跟蹤是由調試引起的錯誤引起的,並且試圖終止導致非法訪問的線程,並且沒有功能影響。

java.lang.IllegalStateException 
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1566) 
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526) 
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) 
at wfr.com.FlowJobController.run(FlowJobController.java:112) 

的FlowJobController.java:112是Job job = new Job();

我到底做錯了什麼?

+0

聽起來像你的'wfr.com.Job'類沒有可能進入你的戰爭或其他發行包。 – Gray

+0

...或者您的Web應用程序已停止/取消部署,但您的線程仍在運行。 –

+0

好吧,這聽起來不可能(不參加戰爭),因爲我正在運行到eclipse環境中,它在類文件夾目錄中,並且沒有顯示有關找不到這些類的錯誤... 關於「web應用程序「已停止,我不知道是什麼導致它 – Saeger

回答

0

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.

如果你說你的代碼故意扔IllegalStateException例外,那是以後的問題的可能原因。如果在靜態初始化中拋出一個未檢查異常,並且該異常傳播,那麼類初始化將失敗,並且類(以及依賴它的所有類)都不可用。在這種情況下,它看起來也導致webapp被停止。

如果這是問題,解決方案是「不這樣做」。修復造成異常被拋出的內容。


另一種可能是,這僅僅是缺少類問題:

Well, that sounds not possible (to not be in the war) since i'm running into the eclipse environment and it's in the class folder directory and no errors is shown about not finding those classes...

的類加載器將不尋求在Eclipse的類文件夾。它將查看Web容器上的webapp目錄(Tomcat,Jetty,無論如何)。

+0

它看起來像我的網絡應用程序已停止。 IllegalStateException是他的線程嘗試通過(現在無效的)Web應用程序類加載器加載類的結果。 –

+0

但是,爲什麼Web應用程序正在停止?我不應該......所有事情都試着抓住,最後......我認爲應該發生的所有事情 – Saeger

+0

好問題,就像應用程序部署一樣,日誌中是否有任何更早的內容。它必須通過部署的一部分,因爲它正在啓動您的線程,可能在此之後失敗? –