Java не удалось запустить проект с помощью команды jar при использовании Quartz, нулевой указатель

#java #spring #quartz-scheduler

#java #spring #quartz-планировщик

Вопрос:

Я использую spring boot для интеграции с Quartz, и у меня возникли проблемы с использованием Autowired в моей работе.

   @Bean
    public Scheduler customScheduler() throws SchedulerException {
        SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactoryBean.getScheduler();
        scheduler.setJobFactory(customJobFactory);// Custom JobFactory makes it possible to use the @Autowired
        scheduler.start();
        return scheduler;
    }
  
 @Configuration
public class CustomJobFactory extends AdaptableJobFactory {

    @Resource
    private AutowireCapableBeanFactory autowireCapableBeanFactory;

    /**
     * Create the job instance, populating it with property values taken
     * from the scheduler context, job data map and trigger data map.
     *
     * @param bundle
     */
    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        Object jobInstance = super.createJobInstance(bundle);
        autowireCapableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }
}
  

Когда все будет готово, в ИДЕЕ запустить проект и протестировать, произошло волшебство, когда я буду использовать проект с maven, упакованный как jar, используйте команду jar для запуска проекта

 @Resource
    private CustomJobFactory customJobFactory;
  

Выходное значение customJobFactory равно null .
Это происходит не каждый раз, и когда это происходит, иногда исключение не возникает, если вы переупаковываете его с помощью maven.

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'quartzJobListener': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'quartzManager': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customScheduler' defined in class path resource [com/th/files/quartz/listener/QuartzJobListener.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.quartz.Scheduler]: Circular reference involving containing bean 'quartzJobListener' - consider declaring the factory method as static for independence from its containing instance. Factory method 'customScheduler' threw exception; nested exception is java.lang.IllegalArgumentException: JobFactory cannot be set to null!
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:321) ~[spring-context-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1422) ~[spring-beans-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) ~[spring-beans-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.6.RELEASE.jar!/:5.2.6.RELEASE]
  

Что я сделал не так?
PS: я использовал как @Resource, так и @Autowired для теста экземпляра CustomJobFactory, и иногда я получаю null.

 spring-boot.version 2.2.7.RELEASE
spring-context.version 5.2.0.RELEASE
quartz.version 2.3.1
quartz-jobs.version 2.3.1
  

Комментарии:

1. Могу ли я спросить, почему вы создаете пользовательский AdaptableJobFactory? Также, к вашему сведению, вы можете использовать spring-boot-starter-quartz для автоматической настройки quartz. И используйте класс SchedulerFactoryBeanCustomizer для настройки почти всего. Также смотрите org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration#quartzScheduler Комментарии к классу и коду

2. @gtiwari333 Причиной использования AdaptableJobFactory является то, что реализация Job для обработки бизнес-логики не может быть создана с использованием Resource .

3. Попробуйте использовать @Component вместо @Configuration для вашего класса CustomJobFactory. Если это не поможет, пожалуйста, поделитесь своим полным кодом.