如何为Quartz的JobStoreTX手动指定数据库连接实例
解决方案
方案1:使用DirectSchedulerFactory内置数据源绑定(推荐)
这是Quartz官方提供的原生支持方案,无需自定义类,直接将你现有的DataSource实例绑定到自定义名称,不需要依赖任何命名服务或JNDI:
import org.quartz.impl.DirectSchedulerFactory import org.quartz.jobstore.jdbc.JobStoreTX import org.quartz.simpl.SimpleThreadPool import javax.sql.DataSource // 此处为你Ktor应用中已经初始化完成的DataSource实例,比如HikariDataSource val appDataSource: DataSource = HikariDataSource(hikariConfig) // 1. 提前向DirectSchedulerFactory绑定数据源实例和自定义名称 DirectSchedulerFactory.getInstance().bindDataSource( "app-datasource-key", // 自定义任意名称,后续JobStore直接使用该名称即可 appDataSource ) // 2. 初始化集群模式JobStoreTX val jobStore = JobStoreTX().apply { isClustered = true dataSource = "app-datasource-key" // 对应上面绑定的自定义名称,无需JNDI支持 // 集群模式必要配置,可按需调整参数 setClusterCheckinInterval(15000) setTxIsolationLevelSerializable(true) // 如果Quartz表前缀不是默认的QRTZ_,需要在此处指定 // setTablePrefix("CUSTOM_QRTZ_") } // 3. 初始化并启动调度器 DirectSchedulerFactory.getInstance().createScheduler( "DS-SCHEDULER", "AUTO", SimpleThreadPool(10, Thread.NORM_PRIORITY), // 建议根据业务配置线程池参数 jobStore ) val scheduler = DirectSchedulerFactory.getInstance().getScheduler("DS-SCHEDULER") scheduler.start()
方案2:自定义JobStore子类
如果不想使用绑定机制,可直接继承JobStoreTX自定义实现,直接注入DataSource实例:
import org.quartz.jobstore.jdbc.JobStoreTX import java.sql.Connection import javax.sql.DataSource class InjectableDataSourceJobStore : JobStoreTX() { // 直接暴露DataSource字段,外部可直接注入实例 lateinit var targetDataSource: DataSource // 覆盖获取连接的逻辑,直接使用注入的DataSource获取连接 override fun getConnection(): Connection { return targetDataSource.connection } } // 使用示例 val jobStore = InjectableDataSourceJobStore().apply { isClustered = true targetDataSource = appDataSource // 直接传入你的DataSource实例 // 其他集群相关配置同上 }
注意事项
- 集群模式下需保证所有调度器节点使用同一数据库,且JobStore相关配置完全一致
- 实例ID设置为
AUTO即可自动生成节点唯一标识,不需要手动配置
内容的提问来源于stack exchange,提问作者Giovanni Alluvatti
相关产品推荐
相关产品推荐

