#spring-boot #configuration #autowired #quartz
Вопрос:
В Spring-boot-starter-quartz
разработчике нужно создать компонент типа SchedulerFactoryBean
, и этот компонент создает компонент типа Scheduler
и добавляет его в контекст spring.
Вот мой класс конфигурации для этой реализации
@Configuration
public class MyQuartzConfiguration {
QuartzProperties quartzProperties;
DataSource dataSource;
ApplicationContext applicationContext;
@Autowired
Scheduler scheduler;
public MyQuartzConfiguration (QuartzProperties quartzProperties,
DataSource dataSource,
ApplicationContext applicationContext) {
this.quartzProperties = quartzProperties;
this.dataSource = dataSource;
this.applicationContext = applicationContext;
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean() {
Properties properties = new Properties();
properties.putAll(quartzProperties.getProperties());
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setDataSource(dataSource);
factory.setJobFactory(new MyAutowirableJobFactory(applicationContext));
factory.setQuartzProperties(properties);
return factory;
}
@PostConstruct
public void scheduleJobs() throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob()
.ofType("a.b.mclass")
.withIdentity(JobKey.jobKey("someKey))
.build();
scheduler.scheduleJob(jobDetail ,
TriggerBuilder.newTrigger()
.forJob(jobDetail)
.withSchedule(CronScheduleBuilder.cronSchedule("myCronExpression"))
.build());
}
У меня есть еще один компонент в контексте, где я Scheduler
программно запускаю один раз для нескольких разных заданий на основе запроса пользователя.
@Component
public class MyService {
private final Scheduler scheduler;
public MyService (Scheduler scheduler) {
this.scheduler = scheduler;
}
......
......
......
}
Весь этот код, упомянутый выше, работает нормально.
Теперь для многократного использования я извлек MyQuartzConfiguration
общий бизнес-код, связанный с планированием, и еще несколько связанных с ним, в его собственную банку и добавил как зависимость Maven в различных службах.
Но теперь, когда я начинаю микросервис. Я получаю ниже ошибки циклической зависимости. Код не изменяется, классы перемещаются только в банку.
Error creating bean with name 'MyQuartzConfiguration'
Unsatisfied dependency expressed through field 'scheduler';
nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException:
Error creating bean with name 'schedulerFactoryBean':
Requested bean is currently in creation: Is there an unresolvable circular reference?
Я могу решить проблему, просто пометив это как @Lazy
в MyService
конструкторе, и к тому времени, когда планировщик потребуется в службе после запуска, компонент уже был бы инициализирован. таким образом, вышеуказанная проблема может быть решена
Но Мои Вопросы таковы
- В чем причина такого поведения при преобразовании в зависимость.
- Есть ли лучший способ справиться с этим, чем просто отмечать его ленивым в службах?