【问题标题】:Illegal access (Quartz with JBoss)非法访问(Quartz with JBoss)
【发布时间】:2010-08-03 15:42:43
【问题描述】:

我在 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 org.quartz.JobDetail.class$ 的错误 [STDERR](JobDetail.java:279) 13:41:00,083 org.quartz.JobDetail.isStateful 中的错误 [STDERR](JobDetail.java:425) 13:41:00,083 org.quartz.simpl.RAMJobStore.triggerFired 的错误 [STDERR](RAMJobStore.java:1313) 13:41:00,083 org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:342) 处的错误 [STDERR]

还有一个 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);
 }

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

你有什么想法吗?

【问题讨论】:

  • 我添加了一些细节以缩小可能出现的问题。

标签: java jboss quartz-scheduler


【解决方案1】:

在您的应用停止后,您的石英作业似乎正在尝试做某事。它可能正在尝试访问您的应用运行时可用的一些资源,但现在不再可用(可能类似于 getResourceAsStream)。

如果您发布更多信息可能会有所帮助:堆栈跟踪、工作代码等。

更新后: 以下是我认为正在发生的事情:

  • 您已成功安排工作
  • 无论出于何种原因,您的 web 应用程序都会停止。我会搜索 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))
  • 由于您的 web 应用程序被停止,您遇到了异常

在我看来,你有两个选择:

  • 忽略这个问题,因为在您的 web 应用程序停止后,您无法做任何事情来让石英工作
  • 尝试找出导致您的 web 应用停止并修复它的原因

【讨论】:

  • 我在其他论坛上读到这个错误通常是由停止的应用程序引起的,但问题是当错误被抛出时我们的应用程序并没有停止。正如我所说,我试图终止会话,即。在作业执行之前设置一个过期的超时(我教过这会关闭作业的一些资源),但即使会话过期,它也没有任何错误地执行。
  • 关闭会话与停止 webapp 不同。在您的代码中,我没有看到与会话相关的任何内容。因此,到期会话无助于跟踪我认为的问题。
  • 有趣的是,发生此异常后,作业再次运行并成功完成。尝试运行作业时可能某些资源不可用,但随后它会访问它们并运行作业。 BTY 是石英能够做这样的事情,我的意思是重新运行失败的工作?
  • 如果您的作业抛出异常,quartz 将简单地忽略它并按计划再次调用您的作业。不可用的资源:StatefulJob 类。也许您的网络应用程序由于某种原因被重新加载。在任何情况下,我都会检查您的 JBoss 日志以了解与重新加载/停止您的 web 应用程序相关的任何内容
  • 我在 JBoss 日志中没有找到任何与重新加载/停止相关的内容。当我再次看到错误时,我会检查日志。无论如何,感谢您的努力。
猜你喜欢
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多