如果我使用quartz调度程序手动启动,Spring Boot会为JPA Repository抛出一个空值

时间:2015-06-01 18:25:42

标签: spring-boot quartz-scheduler

我有一个Quartz Scheduler作为Spring启动应用程序的一部分。我正在从@Configuration文件加载SchedulerFactory。这是我的设置:

Config.java:

@Configuration
public class Config {
    @Bean(name="stdSchedulerFactory_api")
    public StdSchedulerFactory getStdSchedulerFactory() throws SchedulerException{
        return new StdSchedulerFactory("/etc/quartz.properties");
    }   

}

quartz.properties文件包含一个文件的位置,该文​​件包含要执行的作业列表。这是它在属性文件中的配置方式:

org.quartz.plugin.jobInitializer.fileNames =/etc/quartz-config.xml

quartz-config.xml的工作列表如下:

         <job>
            <name>MasterScheduleJob</name>
            <group>MasterScheduleJobGroup</group>
            <description>This is Master Job Scheduler</description>
            <job-class>com.MasterScheduler</job-class>
            <durability>true</durability>
            <recover>false</recover>
        </job>

Master.java

@Component
@Scope("singleton")
public class Master {
    @PostConstruct
    public static void init(){
         // Get SchedulerFactory context from Config file and start the scheduler
         SchedulerFactory factory = null;
         factory = (StdSchedulerFactory) context.getBean("stdSchedulerFactory_api");
         scheduler = factory.getScheduler();
         setScheduler(scheduler);
         scheduler.start();
    }
}

当Master启动时,它会读取Quartz-config.xml文件,然后调用下面的MasterScheduler.java:

MasterScheduler.java

@Service
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class MasterScheduler implements Job {   
    @Autowired
    public JobsScheduleRepository jobsScheduleRepository;
    private List<JobsScheduleDAO> jobsScheduleDAO;

    @Override
    public void execute(JobExecutionContext jobContext) {
       jobsScheduleDAO = jobsScheduleRepository.findAll();
    }
}

当我运行此代码时,我得到一个空指针异常,说jobsScheduleRepository为null。我怀疑这是因为Quartz调度程序在内部使用new()启动MasterScheduler.java。我不想使用Spring提供的Quartz调度程序。还有其他选择吗?

如果有办法避免使用@Autowired并直接访问存储库,我现在可以将其用作临时修复。

0 个答案:

没有答案