使用 oracle 11g 数据库部署在 webshpere 8.5.5.13 上的 Spring 应用程序使用 spring-quartz 按计划运行
Web 服务器是一个有两个节点的集群。如果您只是创建一个触发器+作业+调度程序 - 一切都很好,但是这些作业被安排在所有节点上一次运行。
所以我设置了
org.quartz.jobStore.isClustered = true
但是应该为数据源参数指定什么?
在spring项目中,数据源是这样连接的(在@Configuration类Persistence.java中定义):
@Bean
@Resource(type = DataSource.class, lookup = "jdbc/DATA", name = "jdbc/DATA")
public DataSource dataSource() {
final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
dsLookup.setResourceRef(true);
DataSource dataSource = dsLookup.getDataSource("java:comp/env/jdbc/DATA");
return dataSource;
}
还有一个映射文件
ibm-web-bnd.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-bnd
xmlns="http://websphere.ibm.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-bnd_1_0.xsd"
version="1.0">
<virtual-host name="default_host" />
<resource-ref name="jdbc/DATA" binding-name="jdbc/DATA"/>
</web-bnd>
在 web sphere 本身上,配置了 DATA 数据源
我试图在属性文件中指定石英的选项
org.quartz.jobStore.dataSource=java:comp/env/jdbc/DATA
org.quartz.jobStore.dataSource = jdbc/DATA
org.quartz.jobStore.dataSource = DATA
org.quartz.jobStore.dataSource = dataSource
但是它们都在应用程序运行时导致找不到数据源的错误。
我需要为 spring-quarz 创建一个单独的数据源还是我做错了什么?
开始计划任务的类:
包石英;
@Configuration
@Import(PersistenceConfig.class)
@PropertySource(value = {"classpath:application.properties","classpath:quartz.properties"})
public class QuartzConfig {
@Bean
public JobDetail cronJob() {
return JobBuilder.newJob(QuartzJob.class).withIdentity("helloJob").build();
}
@Bean
public Trigger cronTrigger() {
return TriggerBuilder
.newTrigger()
.withIdentity("helloTrigger")
.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatForever().withIntervalInSeconds(50))
.build();
}
@Bean
public Scheduler cronScheduler(JobDetail cronJob, Trigger cronTrigger) throws SchedulerException {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(cronJob, cronTrigger);
scheduler.start();
return scheduler;
}
}
任务本身
public class QuartzJob implements Job{
private Logger logger = Logger.getLogger(getClass());
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
logger.log(Level.INFO, "========HELLO========%n");
}
}
使用此链接在数据源中发现错误。但是,当触发器触发时,quartz 尝试将其状态写入数据库,但在表中找不到它。我正在寻找这张表的外观,以便他可以写入它以及如何调用它。
org.quartz.impl.jdbcjobstore.LockException:获取数据库行锁失败:ORA-00942:表或视图不存在[参见嵌套异常:java.sql.SQLSyntaxErrorException:ORA-00942:表或视图不存在
构建各种版本数据库的脚本在这里。不要忘记将分支更改为您正在使用的版本。