quartz使用经验谈

在项目重构中,有一部分应用需要从autosys转移到quartz,由于平台差异性以及云计算环境下的集群控制,颇费周折。
1.使用自己的数据库连接池
quartz的集群必须使用数据库,而一般做法是在quartz中配置数据库的连接信息。但是项目里都是用的连接池呢,数据库不想给quartz单独开小灶,咋办呢?其实quartz也可以纳入数据库连接的统一管理的啦。首先写一个类,扩展org.quartz.utils.ConnectionProvider接口,实现getConnection方法
示例代码如下:
public Connection getConnection() throws SQLException
{
try
{
java.sql.Connection con = null;
con = ConnectionPool.getConnection(this.poolName);
return con;
}
catch (Exception e)
{
throw new SQLException("Could not get pool connection with name '" + poolName + "': " + e.getClass().getName()
+ ": " + e.getMessage());
}
}
然后在quartz.properties中加上如下配置:
org.quartz.jobStore.dataSource = mydatasource
org.quartz.dataSource.mydatasource.connectionProvider.class = com.myjob.util.ConnectionPoolConnectionProvider
第一行定义的数据源名字就是第二行中间的那个,第二行定义的类名就是自己写的那个连接类,注意路径哈,这样就可以用我们自己的连接池了。

2.使用集群配置
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
这一句是指定jobstore,集群必须使用数据库,不能是org.quartz.simpl.RAMJobStore
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
org.quartz.jobStore.isClustered = true
这一句配置指定使用集群,quartz的数据库脚本中有新建一个叫做QRTZ_LOCK的表,各job通过竞争这个表的行锁来取得执行权。

3.指定JOB覆盖
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
如果这个覆盖配置为false,quratz启动以后将以数据库的数据为准,配置文件的修改不起作用。这个配置很重要哈,姐被这个折腾了很久~~~配置的参数不起作用,加的listener不起作用,各种错啊,后来清了数据库才好。

4.JOB的参数配置
可以在JOB的定义文件里配置job-data-map来使job的参数配置化。配置文件如下:
<job-detail>
<name>MockJob</name>
<group>JobGroup</group>
<job-class>com.myjob.job.MockJob</job-class>
<volatility>true</volatility>
<durability>false</durability>
<recover>false</recover>
<job-listener-ref>myjobListener</job-listener-ref>
<job-data-map allows-transient-data="true">
<entry>
<key>param1</key>
<value>param-value1</value>
</entry>
</job-data-map>
</job-detail>

读取参数的代码如下:
JobExecutionContext.getJobDetail().getJobDataMap().get("param1");
JobExecutionContext为JOB或者listener的参数

5.JOB的执行日志
找了quartz好像没找到执行记录,就是那种执行一次添加一条记录的表,没办法只好自己实现了。这个在listener里面做比较好,自己写一个listener的类,扩展org.quartz.JobListener接口,需要实现3个方法,我们在jobWasExecuted方法中,也就是job完成之后做记录,新建一张表,记录所需信息就好,job详情可以在JobExecutionContext.getJobDetail()中得到,具体实现略。

6.calendar
用于排除一些特使的节假日等,如何在配置中使用calender还没研究出来,待续
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值