【问题标题】:ClassNotFoundException when Using CronTrigger and MySQL to do scheduler使用 CronTrigger 和 MySQL 做调度器时的 ClassNotFoundException
【发布时间】:2013-07-03 01:25:13
【问题描述】:

java.lang.ClassNotFoundException在Java中使用CronTrigger和MySQL做调度器时

我目前正在开发一个项目,该项目需要调度程序从服务器从 MySQL 数据库下载数据并将其放入存储在固定目录中的文本文件中。我正在使用 CronTrigger 和调度程序来完成此任务,我的项目将驻留在 Tomcat 版本 6.0/webapps 目录中。但是,我在运行程序时遇到了这个问题。

Jul 5, 2013 3:10:00 PM org.quartz.impl.jdbcjobstore.JobStoreSupport triggerFired
SEVERE: Error retrieving job, setting trigger state to ERROR.
org.quartz.JobPersistenceException: Couldn't retrieve job because a required class was not found: bgoc.dwgScheduler.dwg_QuartzAutoDownloadJob [See nested exception: java.lang.ClassNotFoundException: bgoc.dwgScheduler.dwg_QuartzAutoDownloadJob]**<br>

at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveJob(JobStoreSupport.java:1328)<br>
at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggerFired(JobStoreSupport.java:2789)<br>
at org.quartz.impl.jdbcjobstore.JobStoreSupport$37.execute(JobStoreSupport.java:2757)<br>
at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3662)<br>
at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggerFired(JobStoreSupport.java:2751)<br>
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:313)<br>
Caused by: java.lang.ClassNotFoundException: bgoc.dwgScheduler.dwg_QuartzAutoDownloadJob <br>
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)<br>
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)<br>
at org.quartz.simpl.InitThreadContextClassLoadHelper.loadClass(InitThreadContextClassLoadHelper.java:74)<br>
at org.quartz.simpl.CascadingClassLoadHelper.loadClass(CascadingClassLoadHelper.java:118)<br>
at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.selectJobDetail(StdJDBCDelegate.java:897)<br>
at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveJob(JobStoreSupport.java:1316)<br>

我确信我的 java 代码不是问题,因为这个错误不会一直发生。但是,它有30%的发生率,这是相当高的。但是,我不确定我的石英文件是否正确写入。下面是编写的quartz文件。

配置主调度程序属性##

org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.instanceId = one

配置线程池

org.quartz.threadPool.class= org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadPriority = 4

配置 JobStore

org.quartz.jobStore.misfireThreshold = 5000
org.quartz.jobStore.class= org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_

配置数据源

org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3307/QRTZ_BIS
org.quartz.dataSource.myDS.user = root
org.quartz.dataSource.myDS.password = 密码
org.quartz.dataSource.myDS.maxConnections 5

谁能帮我解决这个问题?如果您想了解更多信息,请发布,我会尽快提供。

【问题讨论】:

    标签: java classpath runtime-error classnotfoundexception


    【解决方案1】:

    我也有同样的情况。这是因为我在版本发布期间删除了以前使用的作业。我没有计算留在数据库中的几个触发器(不是 cron,而是简单的延迟触发器)。那些试图执行但失败了,因为他们的工作已经被删除了。

    我最终做的是用空的执行方法主体将工作放回原处(记录它被调用的事实)。

    这样,在使用 empty 方法部署版本后,触发器可以毫无问题地触发,quartz 不会为此抱怨。 在下一个版本中,您也可以删除空作业。

    从石英表中手动删除是有风险的,通常不建议这样做。您可能不知道哪些行属于作业触发器/作业。

    【讨论】:

      【解决方案2】:

      类加载器抱怨类 bgoc.dwgScheduler.dwg_QuartzAutoDownloadJob 丢失。

      这门课是你的吗? 你检查过这个类是否在类路径上吗?

      也许这个类不是必需的,但其他一些类或配置可能正在导入它。

      【讨论】:

      • 是的,bgoc.dwgScheduler.dwg_QuartzAutoDownloadJob 是我的课。我确信它在我的类路径中,因为有时它不会给出错误并产生我想要的结果。该类是必要的,因为它是我运行所有函数并产生结果的地方
      • 好的,我明白了... Quartz 将作业与 Java 类信息一起存储在数据库中。如果 Java 代码更改并且数据库中的类信息引用已删除和/或重命名的类,则会出现此问题。也许您的类已被重命名或删除,并且此类名称已保存在石英使用的表上。尝试用正确的名称替换持久化名称或尝试清除保留作业名称的表。
      • 感谢您的建议,我会尝试清理石英表,看看问题是否仍然存在。
      猜你喜欢
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多