我已经使用 jobRamStore 成功地将 Quartz 实现到我的项目中,现在正在尝试配置 Quartz 以使用 JobStoreTX 来持久保存作业。我唯一改变的是这里的属性文件:
org.quartz.scheduler.instanceName = QuartzJDBC
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread= true
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
#jobstoreTX configuration
#org.quartz.jobStore.nonManagedTXDataSource = nonManaged
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
org.quartz.jobStore.datasource = nonManaged
#non-managed datasource
org.quartz.dataSource.nonManaged.driver = org.postgresql.Driver
org.quartz.dataSource.nonManaged.URL = some/correct/url
org.quartz.dataSource.nonManaged.user = someName
org.quartz.dataSource.nonManaged.password = somePassword
org.quartz.dataSource.nonManaged.maxConnections = 30
在项目初始化期间,我收到以下错误:
org.quartz.SchedulerException:
JobStore class 'org.quartz.impl.jdbcjobstore.JobStoreTX' props could not be configured.
[See nested exception: java.lang.NoSuchMethodException: No setter for property 'datasource']
at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:882)
at org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:1517)
at org.quartz.ee.servlet.QuartzInitializerListener.contextInitialized(QuartzInitializerListener.java:171)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4812)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5255)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NoSuchMethodException: No setter for property 'datasource'
at org.quartz.impl.StdSchedulerFactory.setBeanProps(StdSchedulerFactory.java:1405)
at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:880)
我遵循石英网站上的配置规范,但对我缺少的内容感到困惑。有趣的是,默认情况下仅使用 jobRamStore。如果你们能提供任何帮助,我们将不胜感激。谢谢
我写这个答案的原因是它可以帮助某人。 我花了大约 5 个小时来解决这个问题,因为没有合适的例子。
当我遇到问题时
No setter for property 'datasource'
是因为这个
spring.quartz.properties.org.quartz.jobStore.datasource
在
datasource
的情况下。它应该在 camelCase
即
spring.quartz.properties.org.quartz.jobStore.dataSource
解决此错误后,我收到了另一个与
相关的错误'org.quartz.utils.C3p0PoolingConnectionProvider' could not be instantiated
为此我必须添加我的 gradle 导入
compile group: 'com.mchange', name: 'c3p0', version: '0.9.5.5'
终于可以运行应用程序了 我的整个应用程序配置是
spring:
datasource:
url: jdbc:postgresql://localhost:5432/anonymization-job
username: postgres
password: postgres
driver-class-name: org.postgresql.Driver
quartz:
job-store-type: jdbc
jdbc:
initialize-schema: never
properties:
org:
quartz:
scheduler:
instanceId: AUTO
instanceName: quartz-demo-app
jobStore:
useProperties: true
isClustered: true
clusterCheckinInterval: 5000
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
dataSource: quartzDataSource
misfireThreshold: 60000
dataSource:
quartzDataSource:
driver: org.postgresql.Driver
URL: jdbc:postgresql://localhost:5432/anonymization-job
user: postgres
password: postgres
plugin:
shutdownHook:
class: org.quartz.plugins.management.ShutdownHookPlugin
cleanShutdown: true
java.lang.NoSuchMethodException: No setter for property 'datasource'
大多数情况下,此错误是由于您在开发和部署之间使用了错误的版本(或)缺少 jar。检查开发环境中的 jar 并将其与部署环境进行比较。
也许这个答案会帮助其他遇到这个问题的人。 添加一个像这样的属性: 春天: 石英: 特性: 组织: 石英: 数据源: 石英数据源: 提供商:hikaricp
原因是quartz缺少连接池的属性。