我正在尝试在Spring Boot应用程序中实现Quartz调度程序;但是,我在启动后继续收到以下错误:
Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "SCHED_NAME": invalid identifier.
在错误发生前的启动日志中,我看到:
liquibase : Successfully acquired change log lock
liquibase : Reading from PARTSVOICE_APP.DATABASECHANGELOG
liquibase : Successfully released change log lock
o.q.i.StdSchedulerFactory : Using default implementation for ThreadExecutor
o.q.c.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
o.q.c.QuartzScheduler : Quartz Scheduler v.2.2.3 created.
o.s.s.q.LocalDataSourceJobStore : Using db table-based data access locking (synchronization).
o.s.s.q.LocalDataSourceJobStore : JobStoreCMT initialized.
o.q.c.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.2.3) 'scheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 25 threads.
Using job-store 'org.springframework.scheduling.quartz.LocalDataSourceJobStore' - which supports persistence. and is not clustered.
此消息令人担忧,因为在我的application.yml中,我的设置如下:
org:
quartz:
scheduler:
instanceName: cdp-scheduler
instanceId: AUTO
threadPool:
threadCount: 25
class: org.quartz.simpl.SimpleThreadPool
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
tablePrefix: c_
我读了这些属性并将它们放在SchedulerFactoryBean中:
@Bean
public SchedulerFactoryBean scheduler(DataSource ds, SpringLiquibase dependent) throws SchedulerException, ConnectionException {
SchedulerFactoryBean factory = new SchedulerFactoryBean();
Properties quartzProps = new Properties();
quartzProps.setProperty("org.quartz.scheduler.instanceId", quartzConfig.getInstanceId());
quartzProps.setProperty("org.quartz.scheduler.instanceName", quartzConfig.getInstanceName());
quartzProps.setProperty("org.quartz.threadPool.threadCount", quartzConfig.getThreadCount());
quartzProps.setProperty("org.quartz.jobStore.class", quartzConfig.getJobStoreClass());
quartzProps.setProperty("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.oracle.OracleDelegate");
quartzProps.setProperty("org.quartz.threadPool.class", quartzConfig.getThreadPoolClass());
factory.setOverwriteExistingJobs(true);
factory.setAutoStartup(false);
factory.setDataSource(ds);
factory.setQuartzProperties(quartzProps);
factory.setExposeSchedulerInRepository(true);
factory.setAutoStartup(true);
AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
jobFactory.setApplicationContext(applicationContext);
factory.setJobFactory(jobFactory);
return factory;
}
我正在尝试使用org.quartz.impl.jdbcjobstore.JobStoreTX类,以便我可以将Quartz信息存储在我们的数据库中。但是,我相信这可以从上面的日志消息中看到的内容被覆盖。一个快速的谷歌搜索告诉我,如果你提供一个数据源,那么JobStoreCMT类会自动实现,但这对我没有意义。
我也在使用Liquibase来执行创建石英表的SQL脚本,执行正常,它会丢弃并创建我需要的表。我也试过使用Flybase,但是我得到了同样的错误,所以它肯定与我的石英设置有关。
有没有人有类似的经历?有什么建议?如果您认为我应该提供更多信息,请告诉我。感谢。
答案 0 :(得分:1)
对于错误,我可以推断表格没有正确创建(根本不创建或使用错误的脚本)。对于Quartz
,您需要使用数据库类型的数据库脚本创建表,您可以在石英download中找到它。
以下是类似案例:https://groups.google.com/forum/#!topic/axonframework/IlWZ0UHK2hk
如果您认为该脚本没问题,请尝试直接在您的数据库中创建该表。
如果它仍然不起作用,您可以转到下一步并检查配置。也许你正在使用的tablePrefix
没有得到很好的解释。尝试使用默认的QRTZ_
。
以下是Quartz
的较低版本的设置示例。
http://www.opencodez.com/java/quartz-scheduler-with-spring-boot.htm
让我知道它是否有效!