在Spring Boot中部署Quartz时出现NullPointerException

我试图使用Quartz 2.2.1和spring boot。 我试图声明一个应该将一些数据写入文件的计划任务。 我的工作定义如下:

public class JobTask implements Job { @Autowired JobController controller; @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { try { controller.doPrintData(); } catch (Exception e) { e.printStackTrace(); } } } 

然后 :

 public class StartJob { public static void main(final String[] args) { final SchedulerFactory factory = new StdSchedulerFactory(); Scheduler scheduler; try { scheduler = factory.getScheduler(); scheduler.start(); } catch (SchedulerException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { scheduler = factory.getScheduler(); final JobDetailImpl jobDetail = new JobDetailImpl(); jobDetail.setName("My job"); jobDetail.setJobClass(JobTask.class); final SimpleTriggerImpl simpleTrigger = new SimpleTriggerImpl(); simpleTrigger.setStartTime(new Date(System.currentTimeMillis() + 5000)); //simpleTrigger.setStartTime(dateOf(12, 58, 00,06,05,2016)); simpleTrigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); simpleTrigger.setRepeatInterval(5000); simpleTrigger.setName("Trigger execution every 5 secondes"); scheduler.start(); scheduler.scheduleJob(jobDetail, simpleTrigger); System.in.read(); if (scheduler != null) { scheduler.shutdown(); } } catch (final SchedulerException e) { e.printStackTrace(); } catch (final IOException e) { e.printStackTrace(); } } } 

PS:我已经测试了我的控制器方法’doPrintData’并且它可以工作。 但是当我把它放在面向javaNullPointerException的execute方法中时。

Spring Boot为您管理它。 删除石英依赖项,只需为计划执行创建一个Service

 @Service public class JobScheduler{ @Autowired JobController controller; //Executes each 5000 ms @Scheduled(fixedRate=5000) public void performJob() { controller.doPrintData(); } } 

并为您的应用程序启用任务计划:

 @SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) throws Exception { SpringApplication.run(Application.class); } } 

也可以看看:

  • 在Spring Boot中调度任务

您需要使用SpringBeanJobFactory使用Spring的自动assemblybean创建Job。

 class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware { private transient AutowireCapableBeanFactory beanFactory; public void setApplicationContext(final ApplicationContext context) { beanFactory = context.getAutowireCapableBeanFactory(); } @Override public Object createJobInstance(final TriggerFiredBundle bundle) throws Exception { final Object job = super.createJobInstance(bundle); beanFactory.autowireBean(job); //the magic is done here return job; } } 

然后当你这样做

  SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory(); scheduler = schedFact.getScheduler(); AutowiringSpringBeanJobFactory autowiringSpringBeanJobFactory = new AutowiringSpringBeanJobFactory(); autowiringSpringBeanJobFactory.setApplicationContext(applicationContext); scheduler.setJobFactory(autowiringSpringBeanJobFactory);