quartz 之数据库存储方式 全解

xiaoxiao2021-02-28  236

这段时间公司项目需要,需要用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 #数据库平台 mysql org.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 触发器 表的数据

# 插入要执行的 job INSERT INTO `QRTZ_JOB_DETAILS` VALUES ('scheduler', 'registerDoctorDetail', 'DEFAULT', NULL, 'com.xxx.xxx.business.quartz.jobs.RegisterRongDoctor', '1', '0', '0', '0', null); 、 #Trigger INSERT INTO `QRTZ_TRIGGERS` VALUES ('scheduler', 'register_doctor', 'register_group', 'registerDoctorDetail', 'DEFAULT', NULL, 0, 0, 0, 'ACQUIRED', 'CRON', 1502208000, 0, NULL, 0, null); #trigger express INSERT 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 { 在这里写你要执行的调度的具体业务 } }

转载请注明原文地址: https://www.6miu.com/read-83909.html

最新回复(0)