quartz 之数据库存储方式 全解

来源:互联网 发布:pdf编辑软件免费版 编辑:程序博客网 时间:2024/06/03 22:14

这段时间公司项目需要,需要用quartz做一个调度任务的项目。于是在网上找了些资料,自己也总结一下,以便日后自己的工作和学习。


首先 quartz的方式有三种,这里说的是将调度的任务存储 到数据库的 JobStoreTX方式。


第一步 下载jar 这里就不再赘述


第二步 在项目下添加quartz的配置文件

  

图中 quartz.properties 文件


quartz.properties 文件的代码如下

org.quartz.scheduler.instanceName = MyScheduler#线程数量 执行调度最大的线程数org.quartz.threadPool.threadCount = 5#调度实例失效的检查时间间隔org.quartz.jobStore.clusterCheckinInterval = 20000#数据保存方式 持久化到数据库org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX#数据库平台 mysqlorg.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate#表的前缀org.quartz.jobStore.tablePrefix = QRTZ_#数据库别名 spring配置数据源 则这里配置的数据源不起作用 在spring中指定quartz的数据源#org.quartz.jobStore.dataSource = myDS#org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver#org.quartz.dataSource.myDS.URL = jdbc\:mysql\:(自己的DB的url)#org.quartz.dataSource.myDS.user = (连接数据库的用户名)#org.quartz.dataSource.myDS.password = (密码)#org.quartz.dataSource.myDS.maxConnections = 5
 

强调一点:如果使用spring配置数据源 则则这里配置的数据源是不起作用的。如何在spring中配置quartz的数据源 稍后会说到。


第二部  创建quartz 执行需要的数据库表

SQL代码如下


## 说明 下面的所有表都要创建 要不然会出现错误 在mysql的命令行执行即可## 保存job详细信息的表CREATE TABLE QRTZ_JOB_DETAILS(SCHED_NAME VARCHAR(120) NOT NULL,JOB_NAME VARCHAR(200) NOT NULL,##job的名字JOB_GROUP VARCHAR(200) NOT NULL,##job的所属组的名字DESCRIPTION VARCHAR(250) NULL,JOB_CLASS_NAME VARCHAR(250) NOT NULL,##job实现类的完全包名,quartz就是根据这个路径到classpath找到该job类IS_DURABLE VARCHAR(1) NOT NULL,#是否持久化,把该属性设置为1,quartz会把job持久化到数据库中IS_NONCONCURRENT VARCHAR(1) NOT NULL,IS_UPDATE_DATA VARCHAR(1) NOT NULL,REQUESTS_RECOVERY VARCHAR(1) NOT NULL,JOB_DATA BLOB NULL,#一个blob字段,存放持久化job对象PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))ENGINE=InnoDB;#保存trigger信息 触发器信息表CREATE TABLE QRTZ_TRIGGERS (  SCHED_NAME VARCHAR(120) NOT NULL,  TRIGGER_NAME VARCHAR(200) NOT NULL,#trigger的名字,  TRIGGER_GROUP VARCHAR(200) NOT NULL,#trigger所属组的名字  JOB_NAME VARCHAR(200) NOT NULL,#qrtz_job_details表job_name的外键  JOB_GROUP VARCHAR(200) NOT NULL,#qrtz_job_details表job_group的外键  DESCRIPTION VARCHAR(250) NULL,  NEXT_FIRE_TIME BIGINT(13) NULL,  PREV_FIRE_TIME BIGINT(13) NULL,  PRIORITY INTEGER NULL,  TRIGGER_STATE VARCHAR(16) NOT NULL,#:当前trigger状态,设置为ACQUIRED,如果设置为WAITING,则job不会触发  TRIGGER_TYPE VARCHAR(8) NOT NULL,#CRON  START_TIME BIGINT(13) NOT NULL,  END_TIME BIGINT(13) NULL,  CALENDAR_NAME VARCHAR(200) NULL,  MISFIRE_INSTR SMALLINT(2) NULL,  JOB_DATA BLOB NULL,  PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),  FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)  REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))  ENGINE=InnoDB;#存储cron表达式表CREATE TABLE QRTZ_CRON_TRIGGERS (  SCHED_NAME VARCHAR(120) NOT NULL,  TRIGGER_NAME VARCHAR(200) NOT NULL,#triggers表trigger_name的外键  TRIGGER_GROUP VARCHAR(200) NOT NULL,# qrtz_triggers表trigger_group的外键  CRON_EXPRESSION VARCHAR(120) NOT NULL,#cron表达式  TIME_ZONE_ID VARCHAR(80),  PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),  FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)  REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))  ENGINE=InnoDB;CREATE TABLE QRTZ_SIMPLE_TRIGGERS (  SCHED_NAME VARCHAR(120) NOT NULL,  TRIGGER_NAME VARCHAR(200) NOT NULL,  TRIGGER_GROUP VARCHAR(200) NOT NULL,  REPEAT_COUNT BIGINT(7) NOT NULL,  REPEAT_INTERVAL BIGINT(12) NOT NULL,  TIMES_TRIGGERED BIGINT(10) NOT NULL,  PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),  FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)  REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))  ENGINE=InnoDB;CREATE TABLE QRTZ_SIMPROP_TRIGGERS(  SCHED_NAME VARCHAR(120) NOT NULL,  TRIGGER_NAME VARCHAR(200) NOT NULL,  TRIGGER_GROUP VARCHAR(200) NOT NULL,  STR_PROP_1 VARCHAR(512) NULL,  STR_PROP_2 VARCHAR(512) NULL,  STR_PROP_3 VARCHAR(512) NULL,  INT_PROP_1 INT NULL,  INT_PROP_2 INT NULL,  LONG_PROP_1 BIGINT NULL,  LONG_PROP_2 BIGINT NULL,  DEC_PROP_1 NUMERIC(13,4) NULL,  DEC_PROP_2 NUMERIC(13,4) NULL,  BOOL_PROP_1 VARCHAR(1) NULL,  BOOL_PROP_2 VARCHAR(1) NULL,  PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),  FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)  REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))  ENGINE=InnoDB;CREATE TABLE QRTZ_BLOB_TRIGGERS (  SCHED_NAME VARCHAR(120) NOT NULL,  TRIGGER_NAME VARCHAR(200) NOT NULL,  TRIGGER_GROUP VARCHAR(200) NOT NULL,  BLOB_DATA BLOB NULL,  PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),  INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),  FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)  REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))  ENGINE=InnoDB;CREATE TABLE QRTZ_CALENDARS (  SCHED_NAME VARCHAR(120) NOT NULL,  CALENDAR_NAME VARCHAR(200) NOT NULL,  CALENDAR BLOB NOT NULL,  PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))  ENGINE=InnoDB;CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (  SCHED_NAME VARCHAR(120) NOT NULL,  TRIGGER_GROUP VARCHAR(200) NOT NULL,  PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))  ENGINE=InnoDB;CREATE TABLE QRTZ_FIRED_TRIGGERS (  SCHED_NAME VARCHAR(120) NOT NULL,  ENTRY_ID VARCHAR(95) NOT NULL,  TRIGGER_NAME VARCHAR(200) NOT NULL,  TRIGGER_GROUP VARCHAR(200) NOT NULL,  INSTANCE_NAME VARCHAR(200) NOT NULL,  FIRED_TIME BIGINT(13) NOT NULL,  SCHED_TIME BIGINT(13) NOT NULL,  PRIORITY INTEGER NOT NULL,  STATE VARCHAR(16) NOT NULL,  JOB_NAME VARCHAR(200) NULL,  JOB_GROUP VARCHAR(200) NULL,  IS_NONCONCURRENT VARCHAR(1) NULL,  REQUESTS_RECOVERY VARCHAR(1) NULL,  PRIMARY KEY (SCHED_NAME,ENTRY_ID))  ENGINE=InnoDB;CREATE TABLE QRTZ_SCHEDULER_STATE (  SCHED_NAME VARCHAR(120) NOT NULL,  INSTANCE_NAME VARCHAR(200) NOT NULL,  LAST_CHECKIN_TIME BIGINT(13) NOT NULL,  CHECKIN_INTERVAL BIGINT(13) NOT NULL,  PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))  ENGINE=InnoDB;CREATE TABLE QRTZ_LOCKS (  SCHED_NAME VARCHAR(120) NOT NULL,  LOCK_NAME VARCHAR(40) NOT NULL,  PRIMARY KEY (SCHED_NAME,LOCK_NAME))  ENGINE=InnoDB;COMMIT;

具体的job 触发器 表的数据

# 插入要执行的 jobINSERT INTO `QRTZ_JOB_DETAILS` VALUES ('scheduler', 'registerDoctorDetail', 'DEFAULT', NULL, 'com.xxx.xxx.business.quartz.jobs.RegisterRongDoctor', '1', '0', '0', '0', null);、#TriggerINSERT INTO `QRTZ_TRIGGERS` VALUES ('scheduler', 'register_doctor', 'register_group', 'registerDoctorDetail', 'DEFAULT', NULL,                                                 0, 0, 0, 'ACQUIRED', 'CRON', 1502208000, 0, NULL, 0, null);#trigger expressINSERT INTO `QRTZ_CRON_TRIGGERS` VALUES ('scheduler', 'register_doctor', 'register_group', '0/30 * * * * ?', 'GMT+08');COMMIT;

第三步 :在spring中配置quartz 这里quartz使用了在spring中配置的数据源

<!--配置Quartz 完全基于数据库,无需配置自定义的job类--><bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">   <!-- 以下配置实现了job的持久化 (JobStoreTX)-->   <!-- 事先在数据库里面配置好quartz的信息,然后quartz自动去读取,并实例化 -->   <!-- 运行资源文件QuartzTable.sql文件,就配置好了相关的信息三张表 -->   <property name="jobFactory">      <bean class="com.xxx.xxx.business.quartz.factory.MyJobFactory"/>   </property>   <!--指定spring中的数据源为 quartz的数据源 使用healthDB的数据源做为数据源-->   <property name="dataSource" ref="dataSourceQuartz" />   <property name="configLocation" value="classpath:quartz.properties" />   <property name="applicationContextSchedulerContextKey"           value="applicationContextKey" />   <property name="autoStartup" value="true" /></bean>

MyJobFactory 这是自己定义的一个类 为了可以在job中使用spring的方式注入service
public class MyJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {    private ApplicationContext applicationContext;    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        this.applicationContext = applicationContext;    }    @Override    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {        Object jobInstance = super.createJobInstance(bundle);        //Job交给Spring来管理,这样Job就能使用由Spring产生的Bean        applicationContext.getAutowireCapableBeanFactory().autowireBean(jobInstance);        return jobInstance;    }}

第四步 定义自己的job 只需要实现quartz的Job接口即可
例如:
CopyComment 自己定义的执行调度任务的类
代码如下:
public class CopyComment implements Job{    public CopyComment() {    }    @Resource    private CommentService commentService;    @Resource    private IHistoryCommentService historyCommentService;    @Override    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {在这里写你要执行的调度的具体业务    }}

 

阅读全文
0 0
原创粉丝点击