非法访问(使用JBoss的Quartz)

时间:2010-08-03 15:42:43

标签: java jboss quartz-scheduler

我在网络应用程序中运行预定作业,有时(无法重现)会导致以下异常:

  

[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);
 }

我不知道会出现什么问题。首先,我认为会话在作业执行之前就已经死了,但我已经尝试过了,但事实并非如此。有趣的是,在此异常之后,作业再次运行没有问题。

你有什么想法吗?

1 个答案:

答案 0 :(得分:2)

看起来您的石英作业在您的应用停止后尝试做某事。它可能正在尝试访问您的应用运行时可用的某些资源,但现在可能不再存在(例如getResourceAsStream之类的内容)。

如果你发布更多信息可能有所帮助:stacktraces,你的工作代码等等。

更新后: 以下是我的想法:

  • 您成功安排工作
  • 无论出于何种原因,您的webapp都会停止。我会搜索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)
  • 由于您的网络应用已停止,因此您将获得例外

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

  • 忽略此问题,因为在您的webapp停止后,您无法做任何事情来使石英工作
  • 尝试弄清楚导致您的网络应用停止并修复的原因