Я выполняю запланированное задание в веб-приложении, которое иногда (мог notreproduce это) приводит к следующему исключению:
[WebappClassLoader] Несанкционированный доступ: этот экземпляр веб-приложения уже был остановлен. Не мог загрузить 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. Класс forName0 (Собственный метод) в java.lang. Class.forName (Класс 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)
) Способ Я вижу, у вас есть два варианта: