2016-07-13 45 views
3

我正在尝试使用石英来执行每天重新填充缓存的作业。这并不工作,但我的日志获取与像这样的垃圾邮件JobPersistenceExceptions:由于ClassNotFoundException导致的石英失火

错误[2016年7月13日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) 在 有机quartz.impl.jdbcjobstore.JobStoreSupport $ MisfireHandler.manage(JobStoreSupport.java:3947) at org.quartz.impl.jdbcjobstore.JobStoreSupport $ MisfireHandler.run(JobStoreSupport.java:3968)

所致:抛出java.lang.ClassNotFoundException:在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714) 在 有机 com.test.tarif.jobs.CacheReloadJob。 apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) 在 org.quartz.simpl.InitThreadContextClassLoadHelper.loadClass(InitThreadContextClassLoadHelper.java:72) 在 org.quartz.simpl.CascadingClassLoadHelper.loadClass(CascadingClassLoadHelper。 java:114) at org.quartz.simpl.CascadingClassLoadHelper.loadC小姑娘(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:00工作,但它每隔4分钟就会以这些例外的方式来扫描日志。这里的任何人都知道如何解决这个问题或者至少如何忽略这些失误?

+0

例外告诉你一些组件希望装入类com.test.tarif.jobs.CacheReloadJob同时,该JVM无法加载类(意思是:有在您的JVM的类路径中没有该类的.class文件)。所以,而不是忽略这个例外;我会建议找出你可以找到相应的.class(可能在一些库中);然后确保您的JVM可以访问它。 – GhostCat

+0

它位于WEB-INF \ classes目录下并且可以访问。 – teair

+0

那么,该消息说别的?! – GhostCat

回答

0

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

因此,要么使用不同的表格/模式,要么为每个计划分配一个不同的名称。

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

相关问题