Как получить доступ к Spring Boot Quartz Bean из другого модуля? - PullRequest
1 голос
/ 01 мая 2020

У меня есть проект 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)

1 Ответ

0 голосов
/ 02 мая 2020

У меня была пара проблем. Во-первых, мой сервис 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 для автоматического подключения сервиса, я случайно просто создал его как обычный объект:

@Autowired
private lateinit var quartzService: QuartzService

Спасибо всем за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...