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还没研究出来,待续

你可能感兴趣的:(quartz)