#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. Если это не поможет, пожалуйста, поделитесь своим полным кодом.