java - 非法访问(Quartz 与 JBoss)

标签 java jboss quartz-scheduler

我正在 Web 应用程序中运行计划作业,有时(无法重现它)会导致以下异常:

[WebappClassLoader] Illegal access: this web application instance has been stopped already. Could not load org.quartz.StatefulJob. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. java.lang.IllegalStateException at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1244) at 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) at org.quartz.JobDetail.class$(JobDetail.java:279) at org.quartz.JobDetail.isStateful(JobDetail.java:425) at org.quartz.simpl.RAMJobStore.triggerFired(RAMJobStore.java:1313) at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:342) 13:41:00,083 ERROR [STDERR] Exception in thread "DefaultQuartzScheduler_QuartzSchedulerThread" 13:41:00,083 ERROR [STDERR] java.lang.NoClassDefFoundError: org.quartz.StatefulJob 13:41:00,083 ERROR [STDERR] at org.quartz.JobDetail.class$(JobDetail.java:279) 13:41:00,083 ERROR [STDERR] at org.quartz.JobDetail.isStateful(JobDetail.java:425) 13:41:00,083 ERROR [STDERR] at org.quartz.simpl.RAMJobStore.triggerFired(RAMJobStore.java:1313) 13:41:00,083 ERROR [STDERR] at 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);
 }

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

你有什么想法吗?

最佳答案

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

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

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

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

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

  • 忽略这个问题,因为在你的网络应用程序停止后你无法让quartz继续工作
  • 尝试找出导致您的网络应用停止的原因并进行修复

关于java - 非法访问(Quartz 与 JBoss),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3398201/

相关文章:

java - 如何进行安全套接字通信 Android 到笔记本电脑

java - 为什么在 Wildfly 12 中注入(inject) @Resource 需要 "java:/"前缀?

quartz-scheduler - quartz 触发器构建器 startnow 在启动期间未触发触发器

java - sessionFactory - Spring hibernate 集成问题

java - 如何显示文件选择器下次选择的下一张图像

java - MongoDB:无法使用游标遍历所有数据

c# - jBPM自定义授权

spring - 使用 Spring 管理 JMS 事务

java - 从 3.0 版本开始,Quartz 调度程序不再对 Spring 有用吗?

java - quartz 调度程序2.0