我正在 Web 应用程序中运行计划作业,有时(无法重现它)会导致以下异常:
[WebappClassLoader] 非法访问:此 Web 应用程序实例已被停止。无法加载 org.quartz.StatefulJob。最终的以下堆栈跟踪是由出于调试目的以及尝试终止导致非法访问的线程引发的错误引起的,并且没有功能影响。 java.lang.IllegalStateException 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1244) 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204) 在 java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) 在 java.lang.Class.forName0(本机方法) 在 java.lang.Class.forName(Class.java:169) 在 org.quartz.JobDetail.class$(JobDetail.java:279) 在 org.quartz.JobDetail.isStateful(JobDetail.java:425) 在org.quartz.simpl.RAMJobStore.triggerFired(RAMJobStore.java:1313) 在org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:342) 13:41:00,083 错误 [STDERR] 线程“DefaultQuartzScheduler_QuartzSchedulerThread”中出现异常 13:41:00,083 错误 [STDERR] java.lang.NoClassDefFoundError: org.quartz.StatefulJob 13:41:00,083 错误 [STDERR] 在 org.quartz.JobDetail.class$(JobDetail.java:279) 13:41:00,083 错误 [STDERR] 在 org.quartz.JobDetail.isStateful(JobDetail.java:425) 13:41:00,083 错误 [STDERR] 在 org.quartz.simpl.RAMJobStore.triggerFired(RAMJobStore.java:1313) 13:41:00,083 错误 [STDERR] 在 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);
}
我不知道可能是什么问题。首先,我认为会话在作业执行之前就终止了,但我已经尝试过,但事实并非如此。有趣的是,在这个异常之后,作业再次运行没有问题。
你有什么想法吗?
看起来您的石英作业正在尝试在您的应用程序停止后执行某些操作。它可能会尝试访问应用程序运行时可用的某些资源,但现在不再访问(可能类似于 getResourceAsStream)。
如果您发布更多信息可能会有所帮助:堆栈跟踪、工作代码等。
更新后: 这是我认为正在发生的事情:
org.quartz.simpl.RAMJobStore.triggerFired(RAMJobStore.java:1313)
)isStateful
类的 JobDetail
方法return (StatefulJob.class.isAssignableFrom(jobClass));
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
)在我看来,你有两个选择:
调度程序 sched = StdSchedulerFactory.getDefaultScheduler(); if (!sched.isStarted()){ sched.start(); String konf = MyConfigClass.getRow(25).getKonfiguration();日历 cal = Calendar.getInstance(); cal.setTime(MyParser.stf.parse(konf));字符串表达式 = "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