У меня есть проект Spring Boot, который будет использовать Quartz для управления запуском некоторых скриптов. Структура проекта выглядит следующим образом:
scheduler
|
|__scheduler-api
| |
| |__quartz-bean
|
|__scheduler-composition
|
|__service-to-schedule-quartz-jobs-using-quartz-bean
Модуль API - это приложение Spring Boot, в котором живет кварцевый боб. В модуле композиции находятся мои сервисы, которые будут использоваться для добавления заданий и триггеров в Quartz. Проблема, с которой я сталкиваюсь, заключается в том, что мой компонент Quartz недоступен из модуля композиции, поэтому я не могу планировать задания в своем сервисе так, как хотел бы. Мой Bean-компонент Quartz определен следующим образом:
@Configuration
class QuartzScheduler {
@Autowired
private val applicationContext: ApplicationContext? = null
@Autowired
private val databaseConfiguration: DatabaseConfiguration? = null
@Bean
fun springBeanJobFactory(): SpringBeanJobFactory {
val jobFactory = AutoWiringSpringBeanJobFactory()
jobFactory.setApplicationContext(applicationContext!!)
return jobFactory
}
@Bean
@Throws(SchedulerException::class)
fun scheduler(@Qualifier("schedulerFactoryBean") factory: SchedulerFactoryBean): Scheduler {
val scheduler = factory.scheduler
scheduler.start()
return scheduler
}
@Bean
@Throws(IOException::class)
fun schedulerFactoryBean(): SchedulerFactoryBean {
val factory = SchedulerFactoryBean()
factory.setDataSource(databaseConfiguration!!.dataSource())
factory.setJobFactory(springBeanJobFactory())
factory.setQuartzProperties(quartzProperties())
return factory
}
@Throws(IOException::class)
fun quartzProperties(): Properties {
val propertiesFactoryBean = PropertiesFactoryBean()
propertiesFactoryBean.setLocation(ClassPathResource("/quartz.properties"))
propertiesFactoryBean.afterPropertiesSet()
return propertiesFactoryBean.getObject()!!
}
}
Несколько вещей, которые я пробовал, включают перемещение компонента Quarts в модуль композиции, но тогда у него нет доступа к необходимой конфигурации базы данных. Я также попытался импортировать модуль api в модуль композиции, но он создал циклическую зависимость. Может ли кто-нибудь помочь мне получить доступ к бину Quartz из моего модуля композиции? Я новичок в Spring Boot, поэтому я не совсем уверен, где я иду не так или какие у меня есть варианты. Спасибо!
Редактировать
Мой сервис выглядит следующим образом:
class QuartzService {
@Autowired
private var quartzScheduler: QuartzScheduler? = null
fun upsertJob(job: JobEntity) {
var jobExists = quartzScheduler!!.scheduler().checkExists(JobKey.jobKey(job.id.toString()))
if (!jobExists) {
quartzScheduler!!.scheduler().addJob(
newJob().ofType(EnqueueJob::class.java).storeDurably().withIdentity(JobKey.jobKey(job.id.toString())).build(),
true
)
}
}
}
Появляется ошибка, что тип QuartzScheduler не может быть найден (мой Класс QuartzScheduler от scheduler-api
)