quartz集群动态配置时间

项目开发工作中会遇到各种定时调度的业务开发。当服务器是集群时那么就会出现问题了。所有集群中服务器都会执行定时调度。 又或者定时调度的执行时间是不可控的。需要动态配置。那么就可以用到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='触发器的基本信息。';

猜你喜欢

转载自blog.csdn.net/geeksnow/article/details/77450630