gpt4 book ai didi

java - 非法访问(Quartz 与 JBoss)

转载 作者:行者123 更新时间:2023-11-30 05:10:51 25 4
gpt4 key购买 nike

我正在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com