Незаконный доступ (Кварц с JBoss) - PullRequest
1 голос
/ 03 августа 2010

Я выполняю запланированное задание в веб-приложении, которое иногда (не может воспроизвести его) приводит к следующему исключению:

[WebappClassLoader] Недопустимый доступ: этот экземпляр веб-приложения уже остановлен.Не удалось загрузить org.quartz.StatefulJob.Возможная следующая трассировка стека вызвана ошибкой, генерируемой для целей отладки, а также для попытки завершить поток, который вызвал несанкционированный доступ, и не оказывает никакого функционального влияния.java.lang.IllegalStateException в org.apache.catalina.loader.WebappClassLoader.loadClass (WebappClassLoader.java:1244) в org.apache.catalina.loader.WebappClassLoader.loadClass (WebappClassLoader.javaClan.og): 120loadClassInternal (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 (QuartzScheduler2)13: 41: 00,083 ОШИБКА [STDERR] Исключение в потоке "DefaultQuartzScheduler_QuartzSchedulerThread" 13: 41: 00,083 ОШИБКА [STDERR] java.lang.NoClassDefFoundError: org.quartz.StatefulJob 13: 41: 00RobRoG.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)

Также имеется NoClassFound.Это говорит о том, что 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);
 }

Я не знаю, в чем может быть проблема.Сначала я думал, что сеанс умирает до выполнения задания, но я попробовал, и это не так.Интересно то, что после этого исключения задание запускается снова без проблем.

У вас есть идеи?

1 Ответ

2 голосов
/ 03 августа 2010

Похоже, ваша кварцевая работа пытается что-то сделать после того, как ваше приложение было остановлено.Возможно, он пытается получить доступ к некоторым ресурсам, которые были доступны во время работы вашего приложения, но не больше (что-то вроде getResourceAsStream возможно).

Может помочь, если вы отправите больше информации: stacktraces,код вашей работы и т. д.

После обновления: вот что, по-моему, происходит:

  • Вы успешно запланировали свою работу
  • По какой-либо причине ваше веб-приложениеостановился.Я бы искал в журналах JBoss причину.
  • В этот момент приходит время выполнить вашу работу (org.quartz.simpl.RAMJobStore.triggerFired(RAMJobStore.java:1313))
  • Этот вызов сводится к isStateful методу JobDetail класса
  • Метод содержит этот код return (StatefulJob.class.isAssignableFrom(jobClass));
  • Класс StatefulJob не был загружен ранее.Ваш classLoader пытается загрузить его (org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204))
  • Поскольку ваше веб-приложение было остановлено, вы получаете исключение

На мой взгляд, у вас есть два варианта:

  • Игнорируйте эту проблему, так как вы ничего не можете сделать, чтобы заставить кварц работать после остановки вашего веб-приложения
  • Попробуйте выяснить, что заставляет ваше веб-приложение остановиться и исправить его
...