项目开发工作中会遇到各种定时调度的业务开发。当服务器是集群时那么就会出现问题了。所有集群中服务器都会执行定时调度。 又或者定时调度的执行时间是不可控的。需要动态配置。那么就可以用到quartz集群
以下是maven依赖的quartz包
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
接下来是quartz.xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-lazy-init="false">
<!-- 调度器 -->
<bean name="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 通过这个KEY来配置spring上下文-->
<property name="applicationContextSchedulerContextKey">
<value>applicationContext</value>
</property>
<!-- 这个是数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--加载可执行的任务-->
<bean id="loadTask" class="com.qianwang.service.quartz.LoadTask" init-method="initTask" />
</beans>
其中有个对象是需要注意的。一个是applicationContext 这个是通过key值来配置上下文
dataSource是数据源配置。因为集群配置的quartz是需要落库的。
LoadTask是自己写的一个任务加载对象 其中有初始执行方法initTask 这个方法主要是为了服务器刚启动时将需要加载进来定时调度。进行初始化加载
内部实现和以下的addTask方法相似
以下是动态添加定时间调度方法。 这里需要注意的是。task.getCornTime()定时执行的时间需要大于当前系统服务器时间。否则会报错。
/**
* 添加新的任务
*/
public void addTask(QuartTask task) throws SchedulerException {
LOG.info("添加任务:tasK_{} group_{} , 任务时间:{}",task.getId(),task.getId(), task.getCornTime());
Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobDetail jobDetail = JobBuilder.newJob(QuartzTaskJob.class)
.withIdentity("task_" + task.getId(), "group_" + task.getId()).build();
jobDetail.getJobDataMap().put("scheduleJob", task);
// 表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
.cronSchedule(task.getCronExpression());
// 按新的表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("task_" + task.getId(),
"group_" + task.getId())
.withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail, trigger);
}
数据库建表语句 每一个表加了一个id自增加字段(可去掉)
CREATE TABLE `qrtz_cron_triggers` (
`sched_name` varchar(120) NOT NULL DEFAULT '' COMMENT '调度器名称',
`trigger_name` varchar(200) NOT NULL DEFAULT '' COMMENT '目标名称',
`trigger_group` varchar(200) NOT NULL DEFAULT '' COMMENT '目标组名称',
`cron_expression` varchar(200) NOT NULL DEFAULT '' COMMENT '执行时间',
`time_zone_id` varchar(80) DEFAULT NULL COMMENT '时间区ID',
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
PRIMARY KEY (`id`),
UNIQUE KEY `unique_sched_name_trigger_name_trigger_group` (`sched_name`,`trigger_name`,`trigger_group`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存放cron类型的触发器。';
# Dump of table qrtz_fired_triggers
# ------------------------------------------------------------
CREATE TABLE `qrtz_fired_triggers` (
`sched_name` varchar(120) NOT NULL DEFAULT '' COMMENT '调度器名称',
`entry_id` varchar(95) NOT NULL DEFAULT '' COMMENT '主键',
`trigger_name` varchar(200) NOT NULL DEFAULT '' COMMENT '目标名称',
`trigger_group` varchar(200) NOT NULL DEFAULT '' COMMENT '目标组名称',
`instance_name` varchar(200) NOT NULL DEFAULT '' COMMENT '当前实例的名称',
`fired_time` bigint(13) NOT NULL COMMENT '当前执行时间',
`sched_time` bigint(13) NOT NULL COMMENT '计划时间',
`priority` int(11) NOT NULL COMMENT '权重',
`state` varchar(16) NOT NULL DEFAULT '' COMMENT '状态',
`job_name` varchar(200) DEFAULT NULL COMMENT '作业名称',
`job_group` varchar(200) DEFAULT NULL COMMENT 'job组名称',
`is_nonconcurrent` varchar(1) DEFAULT NULL COMMENT '是否并行',
`requests_recovery` varchar(1) DEFAULT NULL COMMENT '是否要求唤醒',
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
PRIMARY KEY (`id`),
UNIQUE KEY `unique_sched_name_entry_id` (`sched_name`,`entry_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存放已触发的触发器。';
# Dump of table qrtz_job_details
# ------------------------------------------------------------
CREATE TABLE `qrtz_job_details` (
`sched_name` varchar(120) NOT NULL DEFAULT '' COMMENT 'java调度器名称schedulerFactoryBean',
`job_name` varchar(200) NOT NULL DEFAULT '' COMMENT '集群中job的名字',
`job_group` varchar(200) NOT NULL DEFAULT '' COMMENT '集群中job组名',
`description` varchar(250) DEFAULT NULL COMMENT '描述',
`job_class_name` varchar(250) NOT NULL DEFAULT '' COMMENT '调度的类名',
`is_durable` varchar(1) NOT NULL DEFAULT '' COMMENT '是否持久',
`is_nonconcurrent` varchar(1) NOT NULL DEFAULT '' COMMENT '是否不连续',
`is_update_data` varchar(1) NOT NULL DEFAULT '' COMMENT '是否有更新',
`requests_recovery` varchar(1) NOT NULL DEFAULT '' COMMENT '请求恢复',
`job_data` blob COMMENT 'job的时间',
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
PRIMARY KEY (`id`),
UNIQUE KEY `unique_sched_name_job_group` (`sched_name`,`job_name`,`job_group`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存放一个jobDetail信息。';
# Dump of table qrtz_locks
# ------------------------------------------------------------
CREATE TABLE `qrtz_locks` (
`sched_name` varchar(120) NOT NULL DEFAULT '' COMMENT '调度器名称',
`lock_name` varchar(40) NOT NULL DEFAULT '' COMMENT '锁名称',
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
PRIMARY KEY (`id`),
UNIQUE KEY `unique_sched_name_lock_name` (`sched_name`,`lock_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存储程序的悲观锁的信息(假如使用了悲观锁)。';
# Dump of table qrtz_paused_trigger_grps
# ------------------------------------------------------------
CREATE TABLE `qrtz_paused_trigger_grps` (
`sched_name` varchar(120) NOT NULL DEFAULT '' COMMENT '调度器名称',
`trigger_group` varchar(200) NOT NULL DEFAULT '' COMMENT '触发器组',
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
PRIMARY KEY (`id`),
UNIQUE KEY `unique_sched_name_trigger_group` (`sched_name`,`trigger_group`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='存放暂停掉的触发器。';
# Dump of table qrtz_simple_triggers
# ------------------------------------------------------------
CREATE TABLE `qrtz_simple_triggers` (
`sched_name` varchar(120) NOT NULL DEFAULT '' COMMENT '调度器名称',
`trigger_name` varchar(200) NOT NULL DEFAULT '' COMMENT '目标名称',
`trigger_group` varchar(200) NOT NULL DEFAULT '' COMMENT '目标组名称',
`repeat_count` bigint(7) NOT NULL COMMENT '重复次数',
`repeat_interval` bigint(12) NOT NULL COMMENT '触发次数',
`times_triggered` bigint(10) NOT NULL COMMENT '重复间隔',
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
PRIMARY KEY (`id`),
UNIQUE KEY `unique_sched_name_trigger_name_trigger_group` (`sched_name`,`trigger_name`,`trigger_group`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='简单触发器的信息。';
# Dump of table qrtz_triggers
# ------------------------------------------------------------
CREATE TABLE `qrtz_triggers` (
`sched_name` varchar(120) NOT NULL DEFAULT '' COMMENT '调度器名称',
`trigger_name` varchar(200) NOT NULL DEFAULT '' COMMENT '目标名称',
`trigger_group` varchar(200) NOT NULL DEFAULT '' COMMENT '目标组名称',
`job_name` varchar(200) NOT NULL DEFAULT '' COMMENT 'job名称',
`job_group` varchar(200) NOT NULL DEFAULT '' COMMENT 'job组的名称',
`description` varchar(250) DEFAULT NULL COMMENT '描述',
`next_fire_time` bigint(13) DEFAULT NULL COMMENT '执行时间',
`prev_fire_time` bigint(13) DEFAULT NULL COMMENT '预计时间',
`priority` int(11) DEFAULT NULL COMMENT '是否优先',
`trigger_state` varchar(16) NOT NULL DEFAULT '' COMMENT '触发状态触发状态\n触发状态\n触发状态',
`trigger_type` varchar(8) NOT NULL DEFAULT '' COMMENT '触发类型',
`start_time` bigint(13) NOT NULL COMMENT '开始时间',
`end_time` bigint(13) DEFAULT NULL COMMENT '结束时间',
`calendar_name` varchar(200) DEFAULT NULL COMMENT '日历名称',
`misfire_instr` smallint(2) DEFAULT NULL COMMENT '是否不执行',
`job_data` blob COMMENT 'job时间',
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
PRIMARY KEY (`id`),
UNIQUE KEY `unique_sched_name_trigger_name_trigger_group` (`sched_name`,`trigger_name`,`trigger_group`),
KEY `index_sched_name` (`sched_name`,`job_name`,`job_group`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='触发器的基本信息。';