我在网络应用程序中运行预定作业,有时(无法重现)会导致以下异常:
[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) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at java.lang.Class.forName0(Native Method) at 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 ERROR [STDERR]线程中的异常“DefaultQuartzScheduler_QuartzSchedulerThread” 13:41:00,083 ERROR [STDERR] java.lang.NoClassDefFoundError:org.quartz.StatefulJob 13:41:00,083 org.quartz.JobDetail.class的错误[STDERR] $(JobDetail.java:279) 13:41:00,083 org.quartz.JobDetail.isStateful(JobDetail.java:425)的错误[STDERR] 13:41:00,083错误[STDERR] at 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);
}
我不知道会出现什么问题。首先,我认为会话在作业执行之前就已经死了,但我已经尝试过了,但事实并非如此。有趣的是,在此异常之后,作业再次运行没有问题。
你有什么想法吗?
答案 0 :(得分:2)
看起来您的石英作业在您的应用停止后尝试做某事。它可能正在尝试访问您的应用运行时可用的某些资源,但现在可能不再存在(例如getResourceAsStream之类的内容)。
如果你发布更多信息可能有所帮助:stacktraces,你的工作代码等等。
更新后: 以下是我的想法:
org.quartz.simpl.RAMJobStore.triggerFired(RAMJobStore.java:1313)
)isStateful
类JobDetail
方法
return (StatefulJob.class.isAssignableFrom(jobClass));
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
)我看到它的方式,你有两个选择: