非法访问(Quartz 与 JBoss)

问题描述 投票:0回答:2

我正在 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 错误 [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);
 }

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

你有什么想法吗?

java jboss quartz-scheduler
2个回答
1
投票

看起来您的石英作业正在尝试在您的应用程序停止后执行某些操作。它可能会尝试访问应用程序运行时可用的某些资源,但现在不再访问(可能类似于 getResourceAsStream)。

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

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

  • 您的工作安排成功了
  • 无论出于何种原因,您的网络应用程序都会停止。我会搜索 JBoss 日志来找出原因。
  • 现在是执行你的工作的时候了(
    org.quartz.simpl.RAMJobStore.triggerFired(RAMJobStore.java:1313)
    )
  • 此调用会转到
    isStateful
    类的
    JobDetail
    方法
  • 该方法中有这段代码
    return (StatefulJob.class.isAssignableFrom(jobClass));
  • StatefulJob 类之前未加载。你的类加载器尝试加载它(
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
    )
  • 由于您的网络应用程序已停止,您会遇到异常

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

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

0
投票

调度程序 sched = StdSchedulerFactory.getDefaultScheduler(); if (!sched.isStarted()){ sched.start(); String konf = MyConfigClass.getRow(25).getKonfiguration();日历 cal = Calendar.getInstance(); cal.setTime(MyParser.stf.parse(konf));字符串表达式 = "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

© www.soinside.com 2019 - 2024. All rights reserved.