簡體   English   中英

如何從另一個模塊訪問 Spring Boot Quartz Bean?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM