quartz cron表达式 持久化到库怎么配置

Write everything down.
本博客为学习、笔记之用,以笔记形式记录学习的知识与感悟。学习过程中可能参考各种资料,如觉文中表述过分引用,请务必告知,以便迅速处理。如有错漏,不吝赐教。
& 参考的优秀文章
& 用数据库存储定时任务信息
之前的文章所做的demo是将定时任务的信息保存在内存中的,见以下配置
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
如果用内存记录定时任务信息,应用重新启动后,定时任务信息将会丢失。比如,用户A通过系统设置1小时后执行Z操作,设置好后的,因系统重新启动,新启动的系统将会丢失&1小时后执行Z操作&的定时任务。
如果,我们需要在系统意外(或非意外)重新启动后,仍保留定时任务信息,可以使用数据库存储定时任务信息。
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
& 以MySQL为例子,做个简单的DEMO
代码与上一节的&简单的搭建&基本一致,只列出不同的代码。
由于需要连接MySQL数据库,需要加上数据库的JDBC驱动,这里以pom形式下载,也可以直接引入包
&dependency&
&groupId&mysql&/groupId&
&artifactId&mysql-connector-java&/artifactId&
&version&5.1.35&/version&
&/dependency&
然后需要在数据库中建一些Quartz的表,MySQL的建、删表脚本如下。如果你使用的是其他数据库,可以下载Quartz的distribution,在\docs\dbTables下。
# Quartz seems to work best with the driver mm.mysql-2.0.7-bin.jar
# PLEASE consider using mysql with innodb tables to avoid locking issues
# In your Quartz properties file, you'll need to set
# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS;
CREATE TABLE QRTZ_JOB_DETAILS
SCHED_NAME VARCHAR(120) NOT NULL,
VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
JOB_CLASS_NAME
VARCHAR(250) NOT NULL,
IS_DURABLE VARCHAR(1) NOT NULL,
IS_NONCONCURRENT VARCHAR(1) NOT NULL,
IS_UPDATE_DATA VARCHAR(1) NOT NULL,
REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
CREATE TABLE QRTZ_TRIGGERS
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
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_TYPE VARCHAR(8) NOT NULL,
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)
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)
CREATE TABLE QRTZ_CRON_TRIGGERS
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
CRON_EXPRESSION VARCHAR(200) NOT NULL,
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)
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)
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),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
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)
CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_GROUP
VARCHAR(200) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
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)
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)
CREATE TABLE QRTZ_LOCKS
SCHED_NAME VARCHAR(120) NOT NULL,
VARCHAR(40) NOT NULL,
PRIMARY KEY (SCHED_NAME,LOCK_NAME)
看,这个脚本除了给出建、删表语句,也给出了org.quartz.jobStore.driverDelegateClass配置,此项配置到quartz.properties中
注:你可能也注意到了,这些表都是以QRTZ_为前缀的,这是默认的前缀。如果你需要用到其他前缀(个性化需求,或需要配置多个quartz实例),可以在以下项配置(在quartz.properties中)
org.quartz.jobStore.tablePrefix = QRTZ_
最主要的修改是quartz.properties
org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.dataSource = myDS
org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/ll?characterEncoding=utf-8
org.quartz.dataSource.myDS.user = root
org.quartz.dataSource.myDS.password = 123456
org.quartz.dataSource.myDS.maxConnections = 5
OK了,然后我们可以启动Bootstrap类,注册、运行定时任务。你可以发现MySQL的表中已经有此定时任务的记录了。
然后你可以停止Bootstrap类,将Bootstrap类中关于注册、启动定时任务的代码删除或注释,然后启动Bootstrap类,看上一次操作注册的定时任务会不会继续运行。
如无意外,看上一次操作注册的定时任务会继续运行。
阅读(...) 评论()在这里用的版本是spring3.1.1和quartz2.1.1。
首先 要先在项目中导入相关的jar包,可以到官网上去下载,
spring:http://www.springsource.org/
quartz:http://www.quartz-scheduler.org/
其次 ,因为需要把quartz的数据保存到数据库,所以要建立相关的数据库
这个可以从下载到的quartz包里面找到对应的sql脚本,目前可以支持mysql,DB2,oracle等主流的数据库,自己可以根据项目需要选择合适的脚本运行。
mysql,就在数据中建立了一个quartz的database,然后执行tables_mysql_innodb.sql脚本建表。
表建立好后可以看到相关的table
+————————–+
| Tables_in_quartz&&&&&&&& |
+————————–+
| QRTZ_BLOB_TRIGGERS&&&&&& |
| QRTZ_CALENDARS&&&&&&&&&& |
| QRTZ_CRON_TRIGGERS&&&&&& |
| QRTZ_FIRED_TRIGGERS&&&&& |
| QRTZ_JOB_DETAILS&&&&&&&& |
| QRTZ_LOCKS&&&&&&&&&&&&&& |
| QRTZ_PAUSED_TRIGGER_GRPS |
| QRTZ_SCHEDULER_STATE&&&& |
| QRTZ_SIMPLE_TRIGGERS&&&& |
| QRTZ_SIMPROP_TRIGGERS&&& |
| QRTZ_TRIGGERS&&&&&&&&&&& |
+————————–+
然后 ,需要在项目中加上对应的配置。
首先是quartz的配置
quartz.properties
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
org.quartz.jobStore.misfireThreshold = 60000
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.HSQLDBDelegate
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.scheduler.classLoadHelper.class=org.quartz.simpl.CascadingClassLoadHelper
#org.quartz.jobStore.useProperties = true
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false
org.quartz.jobStore.maxMisfiresToHandleAtATime=1
其中org.quartz.jobStore.class是指明quartz的持久化用数据库来保存,
而org.quartz.jobStore.driverDelegateClass是根据选择的数据库类型不同而不同,我这里的是mysql,所以是org.quartz.impl.jdbcjobstore.StdJDBCDelegate
至于quartz.properties的其他详细说明可以看quartz.properties配置文件说明:
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
在集群中每个实例都必须有一个唯一的instanceId,但是应该有一个相同的instanceName
org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = AUTO
#org.quartz.scheduler.skipUpdateCheck = true
#============================================================================
# Configure ThreadPool
#============================================================================
定义线程池,SimpleThreadPool这个线程池只是简单地在它的池中保持固定数量的线程,不增长也不缩小。但是它非常健壮且经过良好的测试,差不多每个Quartz用户都使用这个池。
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3
最多只能有3个线程并发
org.quartz.threadPool.threadPriority = 5
#============================================================================
# Configure JobStore
配置数据存储的方式#============================================================================
一个触发器被认定为“misfired”之前,调度器所能容忍的毫秒数
org.quartz.jobStore.misfireThreshold = 60000
1.所有的Quartz数据,例如Job和Trigger的细节信息被存储在内存(数据库)中。
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
#org.quartz.jobStore.class = org.quartz.simpl.JDBCJobStore
2.配置事务。JobStoreTX来让Quartz帮你管理事务(这是最普遍的选择)。
如果想让Quartz同其他的事务协同工作(例如:J2EE应用服务器中的事务),那么你需要使用JobStoreCMT,这样,Quartz就会让应用服务器容器来管理事务
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT
3.DriverDelegate负责做指定数据库的所有JDBC工作.
如果数据库没有其他指定的代理,那么就试用代理StdJDBCDelegate。
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
为了指示JDBCJobStore所有的JobDataMaps中的值都是字符串,并且能以“名字-值”对的方式存储而不是以复杂对象的序列化形式存储在BLOB字段中,应设置值为”true”(这是缺省的方式)。
org.quartz.jobStore.useProperties = true
配置数据源源的名数、据库表前前缀
#org.quartz.jobStore.dataSource = myDS
#org.quartz.jobStore.tablePrefix = QRTZ_
负载均衡和容错
#org.quartz.jobStore.isClustered = false
#============================================================================
# Configure Datasources
配置数据源
#============================================================================
#org.quartz.dataSource.myDS.driver = org.postgresql.Driver
#org.quartz.dataSource.myDS.URL = jdbc:postgresql://localhost/dev
#org.quartz.dataSource.myDS.user = jhouse
#org.quartz.dataSource.myDS.password =
如果Scheduler非常忙(比如,执行的任务数量差不多和线程池的数量相同,那么你需要正确地配置DataSource的连接数量为线程池数量+1)
#org.quartz.dataSource.myDS.maxConnections = 5
#============================================================================
# Configure Plugins
#============================================================================
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = quartz_data.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 120
org.quartz.plugin.jobInitializer.wrapInUserTransaction =false
数据库的相关配置
jdbc.properties
############quartz db########################
quartz.driverClassName=com.mysql.jdbc.Driver
quartz.url=jdbc:mysql://127.0.0.1:3306/quartz?useUnicode=true
quartz.username=username
quartz.password=password
quartz.minPoolSize=7
quartz.initialPoolSize=12
当然quartz的数据库相关配置也可以写在spring的配置中。
spring的相关配置
加上以下内容:
&bean id=”quartzDataSource” destroy-method=”close”&
&property name=”driverClass” value=”${quartz.driverClassName}”/&
&property name=”jdbcUrl” value=”${quartz.url}”/&
&property name=”user” value=”${quartz.username}”/&
&property name=”password” value=”${quartz.password}”/&
&property name=”minPoolSize” value=”${quartz.minPoolSize}”/&
&property name=”initialPoolSize” value=”${quartz.initialPoolSize}”/&
&context:property-placeholder location=”classpath:jdbc.properties”/&
&bean name=”quartzScheduler” class=”org.springframework.scheduling.quartz.SchedulerFactoryBean”&
&property name=”dataSource”&
&ref bean=”quartzDataSource” /&
&/property&
&property name=”applicationContextSchedulerContextKey”
value=”applicationContext” /&
&property name=”configLocation” value=”classpath:quartz.properties”/&
接下来是java代码部分
首先加上一个定时任务类,继承org.quartz.Job
ParseModelJob
package com.iqbon.jcms.service.
import org.apache.log4j.L
import org.quartz.J
import org.quartz.JobD
import org.quartz.JobExecutionC
import org.quartz.JobExecutionE
import com.iqbon.jcms.domain.Q
import com.iqbon.jcms.util.BeanF
public class ParseModelJob implements Job {
private static final Logger logger = Logger.getLogger(ParseModelJob.class);
public void execute(JobExecutionContext context) throws JobExecutionException {
//这里输入任务处理的内容
}
然后增加一个用于查询当前定时任务信息的类。
package com.iqbon.jcms.dao.
import java.util.HashM
import java.util.L
import javax.sql.DataS
import org.springframework.beans.factory.annotation.A
import org.springframework.beans.factory.annotation.Q
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcT
import org.springframework.stereotype.R
import com.iqbon.jcms.domain.Q
import com.iqbon.jcms.domain.mapRow.QuartzM
* 定时任务的DAO
* @author iqbon
@Repository
public class QuartzDAO {
private NamedParameterJdbcTemplate namedParameterJdbcT
@Autowired
public void setDataSource(@Qualifier(“quartzDataSource”)
DataSource quartzDataSource) {//这里注明是配置文件里面的quartzDataSource数据源
this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(quartzDataSource);
* 查找所有的定时任务
public List&Quartz& selectAllQuartJob() {
String sql = “select QRTZ_JOB_DETAILS.JOB_NAME,QRTZ_TRIGGERS.TRIGGER_NAME”
+ “,NEXT_FIRE_TIME,PREV_FIRE_TIME,TRIGGER_STATE,TRIGGER_TYPE,START_TIME,END_TIME”
+ “,QRTZ_JOB_DETAILS.DESCRIPTION from QRTZ_TRIGGERS inner join QRTZ_JOB_DETAILS ”
+ ” on QRTZ_TRIGGERS.JOB_NAME = QRTZ_JOB_DETAILS.JOB_NAME order by start_time”;
return namedParameterJdbcTemplate.query(sql, new HashMap&String, String&(), new QuartzMapper());
}
最后加上一个定时任务的服务类 QuartzService
package com.iqbon.jcms.service.
import java.util.D
import java.util.HashM
import java.util.L
import java.util.M
import mons.lang3.time.DateFormatU
import org.apache.log4j.L
import org.quartz.CronScheduleB
import org.quartz.CronT
import org.quartz.JobB
import org.quartz.JobDataM
import org.quartz.JobD
import org.quartz.JobK
import org.quartz.S
import org.quartz.SchedulerE
import org.quartz.TriggerB
import org.springframework.beans.factory.annotation.A
import org.springframework.stereotype.S
import com.iqbon.jcms.dao.system.QuartzDAO;
import com.iqbon.jcms.domain.Q
public class QuartzService {
private static final Logger logger = Logger.getLogger(QuartzService.class);
private static Map&String, String& quartzStatus = new HashMap&String, String&(10);
@Autowired
private QuartzDAO quartzDAO;
@Autowired
private Scheduler quartzS
* 查询所有定时任务信息
public List&Quartz& getQuartzJobList() {
return quartzDAO.selectAllQuartJob();
* 增加模板解析任务
* @param jobName
* @param topicIds
* @param description
* @param minutePattern
* @param hourPattern
* @throws SchedulerException
public void addParseModelJob(String jobName, List&String& topicIds, String description,
String minutePattern, String hourPattern) throws SchedulerException {
//初始化JobDetail
JobDataMap dataMap = new JobDataMap();
dataMap.put(Quartz.PARSE_MODEL_TOPIC_KEY, topicIds);
dataMap.put(Quartz.JOB_LOG_KEY, new StringBuilder());
dataMap.put(Quartz.CREATE_JOB_TIME_KEY, DateFormatUtils.ISO_DATETIME_FORMAT.format(new Date()));
JobDetail jobDetail = JobBuilder.newJob(ParseModelJob.class)
.withIdentity(jobName, Scheduler.DEFAULT_GROUP).withDescription(description)
.usingJobData(dataMap).build();
JobDetailBean jobDetail = new JobDetailBean();
//初始化CronTrigger
String cronPattern = “0 ” + minutePattern + ” ” + hourPattern + ” * * ?”;
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity(jobName + “_trigger”, Scheduler.DEFAULT_GROUP)
.forJob(jobDetail).withSchedule(CronScheduleBuilder.cronSchedule(cronPattern)).build();
//添加cornjob
quartzScheduler.scheduleJob(jobDetail, trigger);
* 删除定时任务
* @param jobName
* @throws SchedulerException
public void deleteJob(String jobName) throws SchedulerException {
quartzScheduler.deleteJob(new JobKey(jobName, Scheduler.DEFAULT_GROUP));
浏览: 61105 次
Quartz这个类没有,报错
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Quartz动态配置及持久化
时间: 20:24:01
&&&& 阅读:915
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&由于项目最近需要处理一些订单任务,本人去整理一下关于Quartz的资料。废话不多说,直接上干货!首先在pox.xml文件加入下面quartz的jar:&&&&&&&&&dependency&&&&&&&&&&&& &groupId&org.quartz-scheduler&/groupId&&&&&&&&&&&& &artifactId&quartz&/artifactId&&&&&&&&&&&& &version&2.2.0&/version&&&&&&&& &/dependency&一、这个类关于quartz的管理类import org.quartz.CronScheduleBimport org.quartz.JobBimport org.quartz.JobDimport org.quartz.JobKimport org.quartz.Simport org.quartz.SchedulerEimport org.quartz.Timport org.quartz.TriggerBimport org.quartz.impl.StdSchedulerFpublic class QuartzManage {&& &public static Scheduler scheduler =&& &static {&& &&& &try {&& &&& &&& &scheduler = StdSchedulerFactory.getDefaultScheduler();&& &&& &} catch (SchedulerException e1) {&& &&& &&& &// TODO Auto-generated catch block&& &&& &&& &e1.printStackTrace();&& &&& &}&& &}&& &public static Scheduler getScheduler() {&& &&& &&& &}&& &/**&& & * && & * @param className&& & *&&&&&&&&&&& job实现类名字&& & * @param jobName&& & *&&&&&&&&&&& job名字&& & * @param groupName&& & *&&&&&&&&&&& 组名&& & * @param triggerName&& & *&&&&&&&&&&& 触发器名字&& & * @param cron&& & *&&&&&&&&&&& 表达式&& & */&& &public static void add(Class className, String jobName, String groupName,&& &&& &&& &String triggerName, String cron) {&& &&& &try {&& &&& &&& &Scheduler scheduler = QuartzManage.getScheduler();&& &&& &&& &CronScheduleBuilder builder = CronScheduleBuilder&& &&& &&& &&& &&& &.cronSchedule(cron);&& &&& &&& &JobDetail job = JobBuilder.newJob(className)&& &&& &&& &&& &&& &.withIdentity(jobName, groupName).build();&& &&& &&& &// 触发时间点&& &&& &&& &Trigger trigger = TriggerBuilder.newTrigger()&& &&& &&& &&& &&& &.withIdentity(triggerName, groupName).withSchedule(builder)&& &&& &&& &&& &&& &.build();&& &&& &&& &scheduler.scheduleJob(job, trigger);&& &&& &&& &if (!scheduler.isStarted()) {&& &&& &&& &&& &scheduler.start();&& &&& &&& &}&& &&& &} catch (SchedulerException e) {&& &&& &&& &e.printStackTrace();&& &&& &}&& &}&& &/**&& & * 暂停任务&& & */&& &public static void pause(JobKey jobKey) {&& &&& &try {&& &&& &&& &Scheduler scheduler = QuartzManage.getScheduler();&& &&& &&& &scheduler.pauseJob(jobKey);&& &&& &} catch (SchedulerException e) {&& &&& &&& &e.printStackTrace();&& &&& &}&& &}&& &/**&& & * 恢复任务&& & */&& &public static void recovery(JobKey jobkey) {&& &&& &try {&& &&& &&& &Scheduler scheduler = QuartzManage.getScheduler();&& &&& &&& &scheduler.resumeJob(jobkey);&& &&& &} catch (SchedulerException e) {&& &&& &&& &e.printStackTrace();&& &&& &}&& &}&& &/**&& & * 恢复所有任务&& & */&& &public static void recoveryAll() {&& &&& &try {&& &&& &&& &Scheduler scheduler = QuartzManage.getScheduler();&& &&& &&& &scheduler.resumeAll();&& &&& &} catch (SchedulerException e) {&& &&& &&& &e.printStackTrace();&& &&& &}&& &}&& &/**&& & * 修改调度时间&& & * && & * @param jobName&& & * @param time&& & */&& &public static void modifyJobTime(String triggerName,&& &&& &&& &String triggerGroupName, String time) {&& &&&&&& Scheduler scheduler = QuartzManage.getScheduler();&& &&&& &&& &}}二、这个是quartz.propertiesorg.quartz.scheduler.instanceName = MySchedulerorg.quartz.threadPool.threadCount = 3org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegateorg.quartz.jobStore.tablePrefix = QRTZ_org.quartz.jobStore.dataSource = myDSorg.quartz.scheduler.jmx.export = trueorg.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driverorg.quartz.dataSource.myDS.URL = jdbc:mysql://localhost:3306/***?characterEncoding=utf-8org.quartz.dataSource.myDS.user = rootorg.quartz.dataSource.myDS.password = ***org.quartz.dataSource.myDS.maxConnections = 5org.quartz.jobStore.misfireThreshold = 5000三、这是我自己写的关于job的抽象父类,doBusiness就是处理你所要做的事情的类/***包自己导入即可*//**&* job的父类&*& &*/public abstract class AbstractJobTask implements Job {&& &Logger logger = Logger.getLogger(this.getClass());&& &@Override&& &public void execute(JobExecutionContext context)&& &&& &&& &throws JobExecutionException {&& &&& &this.jobExecutionContext =&& &&& &// TODO Auto-generated method stub&& &&& &try {&& &&& &&& &doBusiness();&& &&& &} catch (Exception e) {&& &&& &&& &// 处理异常&& &&& &&& &doRecordLog(e);&& &&& &}&& &}&& &/**&& & * 处理异常信息&& & * && & * @param e&& & */&& &void doRecordLog(Exception e) {&& &&&&/**&&&&&&& *自己去实现,记录在数据库&&&&&&&&*/&&& }&& &/**&& & * 处理业务&& & * && & * @throws Exception&& & */&& &protected abstract void doBusiness() throws E}四、AbstractJobTask的子类/***包自己导入即可*/public class WaitPayOrderJob extends AbstractJobTask {&&& @Override&& &protected void doBusiness() throws Exception {&& && &&&&/**&&&&&&&&&&&&*自己去实现业务&&&&&&&&&&&&*&&&&&&&&&&&&*/&& &&&& }&& &}}五、关于quartz的表,一定要在数据库里面执行# Quartz seems to work best with the driver mm.mysql-2.0.7-bin.jar## PLEASE consider using mysql with innodb tables to avoid locking issues## In your Quartz properties file, you‘ll need to set # org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate#DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;DROP TABLE IF EXISTS QRTZ_LOCKS;DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;DROP TABLE IF EXISTS QRTZ_TRIGGERS;DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;DROP TABLE IF EXISTS QRTZ_CALENDARS;CREATE TABLE QRTZ_JOB_DETAILS& (&&& SCHED_NAME VARCHAR(120) NOT NULL,&&& JOB_NAME& VARCHAR(200) NOT NULL,&&& JOB_GROUP VARCHAR(200) NOT NULL,&&& DESCRIPTION VARCHAR(250) NULL,&&& JOB_CLASS_NAME&& VARCHAR(250) NOT NULL,&&& IS_DURABLE VARCHAR(1) NOT NULL,&&& IS_NONCONCURRENT VARCHAR(1) NOT NULL,&&& IS_UPDATE_DATA VARCHAR(1) NOT NULL,&&& REQUESTS_RECOVERY VARCHAR(1) NOT NULL,&&& JOB_DATA BLOB NULL,&&& PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP));CREATE TABLE QRTZ_TRIGGERS& (&&& SCHED_NAME VARCHAR(120) NOT NULL,&&& TRIGGER_NAME VARCHAR(200) NOT NULL,&&& TRIGGER_GROUP VARCHAR(200) NOT NULL,&&& JOB_NAME& VARCHAR(200) NOT NULL,&&& JOB_GROUP VARCHAR(200) NOT NULL,&&& 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_TYPE VARCHAR(8) NOT NULL,&&& 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));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));CREATE TABLE QRTZ_CRON_TRIGGERS& (&&& SCHED_NAME VARCHAR(120) NOT NULL,&&& TRIGGER_NAME VARCHAR(200) NOT NULL,&&& TRIGGER_GROUP VARCHAR(200) NOT NULL,&&& CRON_EXPRESSION VARCHAR(200) NOT NULL,&&& 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));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));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),&&& FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)&&&&&&& REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP));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));CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS& (&&& SCHED_NAME VARCHAR(120) NOT NULL,&&& TRIGGER_GROUP& VARCHAR(200) NOT NULL, &&& PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP));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));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));CREATE TABLE QRTZ_LOCKS& (&&& SCHED_NAME VARCHAR(120) NOT NULL,&&& LOCK_NAME& VARCHAR(40) NOT NULL, &&& PRIMARY KEY (SCHED_NAME,LOCK_NAME));六、最重要一步,在项目启动时要启动quartzpublic class ApplicationContextListener implements ServletContextListener {&& &private Logger logger = Logger.getLogger(this.getClass());&& &public static Scheduler scheduler =&& &@Override&& &public void contextInitialized(ServletContextEvent arg0) {&& &&& &("The application start...");&& &&& &/* 注册定时任务 */&& &&& &try { // 获取Scheduler实例&& &&& &&& &scheduler = QuartzManage.getScheduler();&& &&& &&& &scheduler.start();&& &&& &&& &scheduler.resumeAll();//唤醒暂停的任务&& &&& &&& &checkJobExist();&& &&& &} catch (SchedulerException se) {&& &&& &&& &logger.error(se.getMessage(), se);&& &&& &}&& &}&& &private void checkJobExist() {&& &&& &try {&& &&& &&& &// TODO Auto-generated method stub&& &&& &&& &if (!scheduler.checkExists(new JobKey("WaitPayOrderJob",&& &&& &&& &&& &&& &"SayJobGroup"))) {&& &&& &&& &&& &QuartzManage.add(WaitPayOrderJob.class, "WaitPayOrderJob",&& &&& &&& &&& &&& &&& &"SayJobGroup", "WaitPayOrderTrigger", "0/10 * * * * ?");&& &&& &&& &}&& &&& &} catch (SchedulerException e) {&& &&& &&& &e.printStackTrace();&& &&& &}&& &}&& &@Override&& &public void contextDestroyed(ServletContextEvent arg0) {&& &&& &("The application stop...");&& &&& &/* 注销定时任务 */&& &&& &try {&& &&& &&& &// 关闭Scheduler&& &&& &&& &scheduler.shutdown();&& &&& &&& &("The scheduler shutdown...");&& &&& &} catch (SchedulerException se) {&& &&& &&& &logger.error(se.getMessage(), se);&& &&& &}&& &}&& &}标签:&&&&&&&&&
&&国之画&&&& &&&&chrome插件&&
版权所有 京ICP备号-2
迷上了代码!

我要回帖

更多关于 quartz持久化配置 的文章

 

随机推荐