2010-08-03 36 views
1

我在网页上运行的应用程序,有时(可能notreproduce吧)计划作业导致以下异常:非法访问(石英与JBoss)

[WebappClassLoader] Illegal access: this web application instance has been stopped already. Could not load org.quartz.StatefulJob. 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:1244) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:169) at org.quartz.JobDetail.class$(JobDetail.java:279) at org.quartz.JobDetail.isStateful(JobDetail.java:425) at org.quartz.simpl.RAMJobStore.triggerFired(RAMJobStore.java:1313) at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:342) 13:41:00,083 ERROR [STDERR] Exception in thread "DefaultQuartzScheduler_QuartzSchedulerThread" 13:41:00,083 ERROR [STDERR] java.lang.NoClassDefFoundError: org.quartz.StatefulJob 13:41:00,083 ERROR [STDERR] at org.quartz.JobDetail.class$(JobDetail.java:279) 13:41:00,083 ERROR [STDERR] at org.quartz.JobDetail.isStateful(JobDetail.java:425) 13:41:00,083 ERROR [STDERR] at org.quartz.simpl.RAMJobStore.triggerFired(RAMJobStore.java:1313) 13:41:00,083 ERROR [STDERR] at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:342)

此外,还有一个NoClassDefFoundError错误。它说没有找到org.quartz.StatefulJob。 这里是工作的计划方式:

Scheduler sched = StdSchedulerFactory.getDefaultScheduler(); 
if (!sched.isStarted()){ 
    sched.start(); 
} 

String konf = MyConfigClass.getRow(25).getKonfiguration(); 
Calendar cal = Calendar.getInstance(); 
cal.setTime(MyParser.stf.parse(konf)); 
String expression = "0 " + cal.get(Calendar.MINUTE) + " " + cal.get(Calendar.HOUR_OF_DAY) + " ? * MON-FRI"; 
CronTrigger ct = new CronTrigger(triggerName, group, jobName, group, expression); 

if (sched.getTrigger(triggerName, Scheduler.DEFAULT_GROUP) != null) { 
    sched.rescheduleJob(triggerName, group, ct); 
} else { 
    JobDetail jd = new JobDetail(jobName, group, MyJob.class); 
    sched.scheduleJob(jd, ct); 
} 

我不知道可能是什么问题。首先,我认为会议在工作执行前就已经死亡,但我已经尝试过了,情况并非如此。有趣的是,在这个异常之后,作业再次运行没有问题。

你有什么想法吗?

+0

我添加了一些细节来缩小可能的问题。 – Atticus 2010-08-04 06:56:58

回答

2

看起来您的石英工作正在试图在您的应用停止后执行某些操作。它可能试图访问您的应用程序运行时可用的一些资源,但不再是可用资源(例如getResourceAsStream也许)。

如果您发布更多信息可能有帮助:踪迹,你的工作代码等

更新后: 这里是什么,我认为正在发生的事情:

  • 您已成功排定作业
  • 无论出于什么原因你的web应用程序停止。我会搜索JBoss日志的原因。
  • 此时时间来执行作业(org.quartz.simpl.RAMJobStore.triggerFired(RAMJobStore.java:1313)
  • 这个调用下降到JobDetail
  • isStateful方法,该方法中有return (StatefulJob.class.isAssignableFrom(jobClass));
  • StatefulJob类是以前没有加载此代码。你的类加载器试图加载它(org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
  • 因为你的webapp停止,你得到的异常

我看到它的方式,你有两个选择:

  • 忽略这个问题,因为有什么可以做,以使石英工作后,你的webapp停止
  • 揣摩是什么原因导致你的web应用停下来修复它
+0

我已经在其他论坛上看到,这个错误通常是由一个已停止的应用程序引起的,但问题是我们的应用程序在引发错误时没有停止。 正如我所说我试图杀死会议,即。在作业执行之前设置一个会超时的超时时间(我会教会这会关闭一些作业的资源),但即使会话过期,它也没有任何错误地执行。 – Atticus 2010-08-04 07:07:11

+1

关闭会话与停止webapp不同。在你的代码中,我没有看到与会话相关的任何内容。所以,到期会议将无助于追踪我认为的问题。 – 2010-08-04 07:57:44

+0

有趣的是,在发生这种异常之后,作业再次运行并完成。可能有些资源在尝试运行作业时不可用,但随后会访问它们并运行作业。BTY是石英能够做这样的事情,我的意思是重新运行失败的工作? – Atticus 2010-08-04 08:04:07