由于ClassNotFoundException

时间:2016-07-13 11:44:59

标签: java quartz-scheduler

我试图使用石英来完成每天重新填充缓存的工作。这确实有效,但是我的日志被这样的JobPersistenceExceptions垃圾邮件:

  

ERROR [07-13-2016 13:32:01 JobStoreSupport.java:3952] - MisfireHandler:错误处理失误:无法存储触发器   ' Test.TriggerCacheReloadJob'对于   ' Test.CacheReloadJob'   工作:com.test.tarif.jobs.CacheReloadJob   org.quartz.JobPersistenceException:无法存储触发器   ' Test.TriggerCacheReloadJob'对于   ' Test.CacheReloadJob'   job:com.test.tarif.jobs.CacheReloadJob [请参阅嵌套异常:   抛出java.lang.ClassNotFoundException:   com.test.tarif.jobs.CacheReloadJob ]   org.quartz.impl.jdbcjobstore.JobStoreSupport.storeTrigger(JobStoreSupport.java:1212)     在   org.quartz.impl.jdbcjobstore.JobStoreSupport.doUpdateOfMisfiredTrigger(JobStoreSupport.java:1026)     在   org.quartz.impl.jdbcjobstore.JobStoreSupport.recoverMisfiredJobs(JobStoreSupport.java:975)     在   org.quartz.impl.jdbcjobstore.JobStoreSupport.doRecoverMisfires(JobStoreSupport.java:3187)     在   org.quartz.impl.jdbcjobstore.JobStoreSupport $ MisfireHandler.manage(JobStoreSupport.java:3947)     在   org.quartz.impl.jdbcjobstore.JobStoreSupport $ MisfireHandler.run(JobStoreSupport.java:3968)

     

引起:java.lang.ClassNotFoundException:   com.test.tarif.jobs.CacheReloadJob at   org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)     在   org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)     在   org.quartz.simpl.InitThreadContextClassLoadHelper.loadClass(InitThreadContextClassLoadHelper.java:72)     在   org.quartz.simpl.CascadingClassLoadHelper.loadClass(CascadingClassLoadHelper.java:114)     在   org.quartz.simpl.CascadingClassLoadHelper.loadClass(CascadingClassLoadHelper.java:138)     在   org.quartz.impl.jdbcjobstore.StdJDBCDelegate.selectJobDetail(StdJDBCDelegate.java:873)     在   org.quartz.impl.jdbcjobstore.JobStoreSupport.storeTrigger(JobStoreSupport.java:1194)     ...

我的quartz.properties:

org.quartz.scheduler.instanceName = Test_Scheduler
org.quartz.scheduler.instanceId = 1
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.scheduler.misfirePolicy =  doNothing

我的日程安排员:

public class RestStarterListener implements ServletContextListener {

    @Override
    public void contextInitialized(final ServletContextEvent arg0) {
        try {
            log.info("Starting");
            JobDetail job = JobBuilder.newJob(CacheReloadJob.class)
                    .withIdentity("job1", "group1")
                    .build();
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
                    .withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(07, 00)).build();
            Scheduler scheduler = new StdSchedulerFactory().getScheduler();
            scheduler.clear();
            scheduler.scheduleJob(job, trigger);
            scheduler.start();
        } catch (SchedulerException e) {
            log.error("Failed to start Job");
            log.error(e, e);
        }

    }
}

Job.class有一个零参数构造函数,实现Job并保存填充缓存的方法。这很长。 正如我所说的那样,这项工作在7点开始工作,但它每隔4分钟就会发现这些例外日志。这里有人知道如何解决这个问题或者至少如何忽略失火?

1 个答案:

答案 0 :(得分:0)

这是因为您在JOB_CLASS_NAME中使用了错误的名称。或者你有几个战争指向同一个数据库(使用相同的表-prefix-)并使用相同的SCHED_NAME。这样,不同的war会触发不在其类路径中的作业。

因此,要么使用不同的表/模式,要么为每个时间表分配不同的名称。

更多信息: http://forums.terracotta.org/forums/posts/list/7073.page