我用Quartz定义了一个CRON触发器,它成功地触发了几次,在某些周期后以错误状态结束,并带有以下消息(类名和包名已被编辑):
org.quartz.JobPersistenceException: Couldn't retrieve job because a required class was not found: xxx.xxx.xxx.MyQuartzJob
at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveJob(JobStoreSupport.java:1393) [quartz-2.3.2.jar!/:na]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.acquireNextTrigger(JobStoreSupport.java:2864) [quartz-2.3.2.jar!/:na]
at org.quartz.impl.jdbcjobstore.JobStoreSupport$41.execute(JobStoreSupport.java:2805) [quartz-2.3.2.jar!/:na]
at org.quartz.impl.jdbcjobstore.JobStoreSupport$41.execute(JobStoreSupport.java:2803) [quartz-2.3.2.jar!/:na]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3864) [quartz-2.3.2.jar!/:na]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.acquireNextTriggers(JobStoreSupport.java:2802) [quartz-2.3.2.jar!/:na]
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:287) [quartz-2.3.2.jar!/:na]
Caused by: java.lang.ClassNotFoundException: xxx.xxx.xxx.MyQuartzJob
at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0_302]
at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[na:1.8.0_302]
at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151) ~[app.jar:2.4.0-SNAPSHOT]
at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0_302]
at java.lang.Class.forName0(Native Method) ~[na:1.8.0_302]
at java.lang.Class.forName(Class.java:348) ~[na:1.8.0_302]
at org.springframework.util.ClassUtils.forName(ClassUtils.java:284) ~[spring-core-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.scheduling.quartz.ResourceLoaderClassLoadHelper.loadClass(ResourceLoaderClassLoadHelper.java:81) ~[spring-context-support-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.springframework.scheduling.quartz.ResourceLoaderClassLoadHelper.loadClass(ResourceLoaderClassLoadHelper.java:87) ~[spring-context-support-5.2.7.RELEASE.jar!/:5.2.7.RELEASE]
at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.selectJobDetail(StdJDBCDelegate.java:852) ~[quartz-2.3.2.jar!/:na]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveJob(JobStoreSupport.java:1390) [quartz-2.3.2.jar!/:na]
一旦发生此错误,触发器将自身更新为ERROR
状态,不再触发。奇怪的是,触发器已经成功地发射了几次(有时高达4次),并且在下一次迭代时突然无法加载类。如果我再次手动将其状态更新为WAITING
,那么它将在更新后立即触发一次,并继续其日程安排:它可以工作几个周期,并且在某个时候由于我复制的错误而无法再次启动,并将自身更新为ERROR
状态。
我不知道为什么,也不知道如何解决这个问题。在Quartz数据库上没有访问并发性,因为我们运行的是单个服务器实例,因此我不明白为什么要在同一版本的部署服务器上多次成功地找到和加载类。
数据库中完全限定的类名是正确的(包名+类名)。
如对此有任何建议,将不胜感激。如果需要的话,可以随时询问更多细节。
发布于 2022-05-05 08:41:43
这是Spring应用程序中遇到的一个非常常见的问题,Spring调度程序工厂创建一个Quartz调度器实例,默认情况下使用org.springframework.scheduling.quartz.ResourceLoaderClassLoadHelper
作为类加载助手。在堆栈跟踪中可以看到这个类加载助手。石英使用类load加载作业实现类。
要解决此问题,请将以下属性添加到您的quartz.properties中:
org.quartz.simpl.CascadingClassLoadHelper
org.quartz.scheduler.classLoadHelper.class =
发布于 2022-05-06 14:05:32
我试图理解为什么在配置中更改旧ClassLoadHelper类后仍然会出现错误,结果发现我们在云提供商上运行了第二个应用程序“隐藏”实例,代码的旧版本是几个月前的版本。
它多次尝试触发,但失败了,因为那时Quartz作业类不存在,因此将触发器设置为real最新实例使用的同一个数据库中的错误状态。为了解决这种情况,我们只需要摆脱这个无关的实例。
对不起,误导的信息,我没有意识到这另一个例子时,张贴这个问题。
发布于 2022-07-28 08:31:01
也许您的qrtz_job_details表存在一些不正确的数据。重复工作名称。请检查qrtz_job_details,qrtz_triggers表数据
https://stackoverflow.com/questions/72123671
复制相似问题