【问题标题】:How to manually specify db connection for Quartz JobStoreTX如何为 Quartz JobStoreTX 手动指定数据库连接
【发布时间】:2021-08-18 09:22:15
【问题描述】:

我正在尝试在 Ktor 应用程序中以集群模式配置 Quartz。 我想避免使用属性文件,所以我以编程方式进行调度程序初始化。 这是我到目前为止所取得的成就:

val jobStore = JobStoreTX()
    jobStore.setIsClustered(true)
    jobStore.dataSource = "datasourceName" //Here is the issue - I want to inject datasource object, not the name
DirectSchedulerFactory.getInstance().createScheduler(
    "DS-SCHEDULER",
    "AUTO",
    SimpleThreadPool(),
    jobStore)
val scheduler = DirectSchedulerFactory.getInstance().getScheduler("DS-SCHEDULER")
scheduler.start()

我看到 JobStoreTX 类只允许注入数据源名称,但我想提供一个 DataSource 对象,因为 Ktor 应用程序没有命名服务。 有没有其他方法可以实现这一目标?

【问题讨论】:

标签: quartz-scheduler ktor


【解决方案1】:

想出了解决办法。 因此,给定数据源名称“myDs”,Quartz JobStoreSupport 类将按如下名称查找数据源:

DBConnectionManager.getInstance().getConnection(getDataSource())

其中 getDatasource() 是返回数据源名称字符串 ("myDs") 的内部方法。

所以我必须在初始化调度程序之前手动将连接提供程序添加到 DBConnectionManager:

DBConnectionManager.getInstance().addConnectionProvider(
        "myDs",
        HikariCpPoolingConnectionProvider(
            "dbDriver",
            "dbUrl",
            "username",
            "password",
            10,
            "validation Query"
        )
    )

然后我可以初始化调度程序:

val jobStore = JobStoreTX()
    jobStore.setIsClustered(true)
    jobStore.dataSource = "myDs
    val simpleThreadPool = SimpleThreadPool()
    simpleThreadPool.threadCount = 5
    DirectSchedulerFactory.getInstance().createScheduler(
        "Scheduler Name,
        "AUTO",
        simpleThreadPool,
        jobStore
    )

调度程序工厂然后能够查找数据源并获取数据库连接。

【讨论】:

  • 我有与 urs 相同的要求,通过引用我在下面编写的这段代码,它不起作用。我收到 org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'group2.jobA',因为这个标识已经存在。
  • 您手动创建了所有石英表?有没有办法通过库添加它?
  • ktor中没有办法添加quartz.properties文件吗?
猜你喜欢
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
相关资源
最近更新 更多