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
- quartz 之数据库存储方式 全解
- Android数据存储方式之:数据库操作
- android存储方式之sqlite数据库
- 安卓常用数据存储方式之数据库存储
- Android开发之五大存储方式之一数据库存储
- 了解数据库存储方式
- Android数据的四种存储方式之SQLite数据库
- Android五大存储方式之数据库升级篇
- Android开发之数据存储之二:SQLite数据库存储方式【免费提供源码下载】
- 全扫描的影响因素之数据在数据块中的存储方式
- quartz储存方式之JDBC JobStoreTX
- oscar数据库以及oracle数据库quartz调度方式
- quartz各版本MySQL数据库存储建表SQL语句
- quartz各版本MySQL数据库存储建表SQL语句
- 数据库之存储过程
- 数据库之存储过程
- 数据库之存储过程
- 数据库之存储过程
- jquery sortable参数说明
- laydate源码解决时间是31号(即月大时候)直接跳过一个月(比如8月31号,直接到10月1号)跨过九月,源码有改动,只供参考
- Qt显示PDF之三 pdfium编译
- 理解函数调用实现过程 栈结构 栈过程
- AndroidTv Home界面实现原理(一)——Leanback 库的使用
- quartz 之数据库存储方式 全解
- 纯c实现的俄罗斯方块(加了一点c++的priority queue)
- 使用FreeType实现矢量字体的粗体、斜体、描边、阴影效果(转载)
- Glide源码解析:加载请求与生命周期绑定
- scp文件到远端服务器提示 command not found
- Tab页-------------ionic3+anjular4(一)
- PostgreSQL的递归查询(with recursive)
- 优化myeclipse启动速度以及解决内存不足问题
- MySQL字符串函数总结