Java 在Spring Boot中部署Quartz时出现NullPointerException

Java 在Spring Boot中部署Quartz时出现NullPointerException,java,spring-boot,quartz-scheduler,Java,Spring Boot,Quartz Scheduler,我正在尝试使用石英2.2.1与弹簧启动。我试图声明一个计划任务,该任务应该将一些数据写入文件。我的工作定义如下: public class JobTask implements Job { @Autowired JobController controller; @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { try {

我正在尝试使用石英2.2.1与弹簧启动。我试图声明一个计划任务,该任务应该将一些数据写入文件。我的工作定义如下:

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”,它可以工作。但是当我把它放在execute方法中时,我面对的是javaNullPointerException

Spring Boot为您管理它。删除quartz依赖项,只需创建一个用于计划执行的:

@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为您管理它。删除quartz依赖项,只需创建一个用于计划执行的:

      @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);
          }
      }
      
      另请参见:


      您需要使用SpringBeanJobFactory使用Spring的自动连接bean创建作业

      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);
      

      您需要使用SpringBeanJobFactory使用Spring的自动连接bean创建作业

      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);
      

      所有这些对new的调用意味着这些bean是你的责任,而不是Spring的责任。它们不在Spring的控制之下,因此您不能期望它们被注入我也试过了,删除了自动布线部分,因为vainCalling“new”的意思是“不是Spring的问题”。你仍然在做错事。那么,我怎样才能让它在不调用new和autowired注释的情况下工作呢?把这个bean及其所有依赖项置于Spring的控制之下。不能半途而废。要么是全新的,要么是全新的Spring。所有这些对new的调用意味着这些bean是你的责任,而不是Spring的责任。它们不在Spring的控制之下,因此您不能期望它们被注入我也试过了,删除了自动布线部分,因为vainCalling“new”的意思是“不是Spring的问题”。你仍然在做错事。那么,我怎样才能让它在不调用new和autowired注释的情况下工作呢?把这个bean及其所有依赖项置于Spring的控制之下。不能半途而废。要么全是新的,要么全是春天。