quartz集群动态配置时间

来源:互联网 发布:linux find 编辑:程序博客网 时间:2024/06/08 18:34

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