[英]How to access Spring Boot Quartz Bean from another module?
我有一個 Spring 引導項目,它將使用 Quartz 來管理一些腳本的運行。 項目布局如下:
scheduler
|
|__scheduler-api
| |
| |__quartz-bean
|
|__scheduler-composition
|
|__service-to-schedule-quartz-jobs-using-quartz-bean
api 模塊是石英豆所在的 Spring 引導應用程序。 組合模塊是我的服務所在的地方,它將用於向 Quartz 添加作業和觸發器。 我遇到的問題是無法從組合模塊訪問我的 Quartz bean,因此我無法像我想要的那樣在我的服務中安排作業。 我的 Quartz bean 定義如下:
@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 bean 移動到組合模塊,但是它無法訪問它需要的數據庫配置。 我還嘗試將 api 模塊導入組合模塊,但它創建了循環依賴。 有人可以幫我從我的合成模塊中訪問 Quartz bean 嗎? 我是 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 class from scheduler-api
)
我遇到了幾個問題。 首先,我的 Quartz 服務不正確地自動連接調度程序。 我把它改成這樣:
class QuartzService {
@Autowired
private lateint var scheduler: Scheduler
fun upsertJob(job: JobEntity) {
var jobExists = scheduler.checkExists(JobKey.jobKey(job.id.toString()))
if (!jobExists) {
scheduler.addJob(
newJob().ofType(EnqueueJob::class.java).storeDurably().withIdentity(JobKey.jobKey(job.id.toString())).build(),
true
)
}
}
}
接下來,我不得不更改使用 Quartz 服務的 class 來自動連接服務,我不小心將它實例化為普通的 object:
@Autowired
private lateinit var quartzService: QuartzService
感謝大家的幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.