如何从另一个模块访问 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 石英 bean 所在的引导应用程序。组合模块是我的服务所在的地方,将用于向 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(my 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 以自动连接该服务,我不小心将其实例化为普通对象:
@Autowired
private lateinit var quartzService: QuartzService
感谢大家的帮助!
我有一个 Spring 启动项目,它将使用 Quartz 来管理一些脚本的 运行。项目布局如下:
scheduler
|
|__scheduler-api
| |
| |__quartz-bean
|
|__scheduler-composition
|
|__service-to-schedule-quartz-jobs-using-quartz-bean
api 模块是一个 Spring 石英 bean 所在的引导应用程序。组合模块是我的服务所在的地方,将用于向 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(my 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 以自动连接该服务,我不小心将其实例化为普通对象:
@Autowired
private lateinit var quartzService: QuartzService
感谢大家的帮助!