Quartz-任务进度管理器
来源:SegmentFault
2023-02-24 13:03:29
0浏览
收藏
在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是数据库学习者,那么本文《Quartz-任务进度管理器》就很适合你!本篇内容主要包括Quartz-任务进度管理器,希望对大家的知识积累有所帮助,助力实战开发!
Quartz简介-参考链接
Quartz是完全由
//调度标识名 集群中每一个实例都必须使用相同的名称 (区分特定的调度器实例) org.quartz.scheduler.instanceName:DefaultQuartzScheduler //ID设置为自动获取 每一个必须不同 (所有调度器实例中是唯一的) org.quartz.scheduler.instanceId :AUTO //数据保存方式为持久化 org.quartz.jobStore.class :org.quartz.impl.jdbcjobstore.JobStoreTX //表的前缀 org.quartz.jobStore.tablePrefix : QRTZ_ //设置为TRUE不会出现序列化非字符串类到 BLOB 时产生的类版本问题 //org.quartz.jobStore.useProperties : true //加入集群 true 为集群 false不是集群 org.quartz.jobStore.isClustered : false //调度实例失效的检查时间间隔 org.quartz.jobStore.clusterCheckinInterval:20000 //容许的最大作业延长时间 org.quartz.jobStore.misfireThreshold :60000 //ThreadPool 实现的类名 org.quartz.threadPool.class:org.quartz.simpl.SimpleThreadPool //线程数量 org.quartz.threadPool.threadCount : 10 //线程优先级 org.quartz.threadPool.threadPriority : 5(threadPriority 属性的最大值是常量 java.lang.Thread.MAX_PRIORITY,等于10。最小值为常量 java.lang.Thread.MIN_PRIORITY,为1) //自创建父线程 //org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true //数据库别名 org.quartz.jobStore.dataSource : qzDS //设置数据源 org.quartz.dataSource.qzDS.driver:com.mysql.jdbc.Driver org.quartz.dataSource.qzDS.URL:jdbc:mysql://localhost:3306/quartz org.quartz.dataSource.qzDS.user:root org.quartz.dataSource.qzDS.password:123456 org.quartz.dataSource.qzDS.maxConnection:10
demo实例
RAM方式
引入依赖
<!-- quartz -->
<dependency><groupid>org.quartz-scheduler</groupid><artifactid>quartz</artifactid><version>2.2.1</version></dependency><dependency><groupid>org.quartz-scheduler</groupid><artifactid>quartz-jobs</artifactid><version>2.2.1</version></dependency><dependency><groupid>ch.qos.logback</groupid><artifactid>logback-classic</artifactid><version>1.0.11</version></dependency>Job类
package com.zyc;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RAMJob implements Job{
private static Logger logger = LoggerFactory.getLogger(RAMJob.class);
public void execute(JobExecutionContext arg0) throws JobExecutionException {
logger.info("Say hello to Quartz" + new Date());
}
}测试类 CronScheduleBuilder
import java.util.Date;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RAMQuartzTest {
private static Logger _log = LoggerFactory.getLogger(RAMQuartzTest.class);
public static void main(String[] args) throws SchedulerException {
//1.创建Scheduler的工厂
SchedulerFactory sf = new StdSchedulerFactory();
//2.从工厂中获取调度器实例
Scheduler scheduler = sf.getScheduler();
//3.创建JobDetail
JobDetail jb = JobBuilder.newJob(RAMJob.class)
.withDescription("this is a ram job") //job的描述
.withIdentity("ramJob", "ramGroup") //job 的name和group
.build();
//任务运行的时间,SimpleSchedle类型触发器有效
long time= System.currentTimeMillis() + 13*1000L; //13秒后启动任务
Date statTime = new Date(time);
//4.创建Trigger
//使用SimpleScheduleBuilder或者CronScheduleBuilder
Trigger t = TriggerBuilder.newTrigger()
.withDescription("")
.withIdentity("ramTrigger", "ramTriggerGroup")
//.withSchedule(SimpleScheduleBuilder.simpleSchedule())
.startAt(statTime) //默认当前时间启动
.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) //两秒执行一次
.build();
//5.注册任务和定时器
scheduler.scheduleJob(jb, t);
//6.启动 调度器
scheduler.start();
_log.info("启动时间 : " + new Date());
//scheduler.shutdown();
}
}SimpleScheduleBuilder
//4.创建Trigger
//使用SimpleScheduleBuilder或者CronScheduleBuilder
Trigger t = TriggerBuilder.newTrigger()
.withDescription("")
.withIdentity("ramTrigger", "ramTriggerGroup")
.withSchedule(SimpleScheduleBuilder.simpleSchedule())
.startAt(statTime) //默认当前时间启动
// .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) //两秒执行一次
.build();SpringBoot集成Quartz实例
引入pom依赖
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-quartz</artifactid></dependency>
配置Quartz的配置
.properties
###################### quartz begin ############################## spring.quartz.job-store-type=jdbc spring.quartz.properties.org.quartz.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.quartz.properties.org.quartz.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.quartz.properties.org.quartz.datasource.username=root spring.quartz.properties.org.quartz.datasource.password=123456 spring.quartz.properties.org.quartz.scheduler.instancName=clusteredScheduler spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate spring.quartz.properties.org.quartz.jobStore.tablePrefix=qrtz_ spring.quartz.properties.org.quartz.jobStore.isClustered=true spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=1000 spring.quartz.properties.org.quartz.jobStore.useProperties=false spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool spring.quartz.properties.org.quartz.threadPool.threadCount=20 spring.quartz.properties.org.quartz.threadPool.threadPriority=5 ###################### quartz begin ##############################
.yml
spring:
quartz:
job-store-type: jdbc
properties:
org:
quartz:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/data?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=CONVERT_TO_NULL&allowMultiQueries=true
username: root
password: root
scheduler:
instancName: clusteredScheduler
instanceId: AUTO
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
tablePrefix: qrtz_
isClustered: true
clusterCheckinInterval: 1000
useProperties: false
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 20
threadPriority: 5实现Job接口,实现业务调度
@Slf4j
public class TaskExecuteJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//执行业务调度
String taskId = context.getJobDetail().getKey().toString();
String[] s = taskId.split("_");
if (s.length > 1) {
taskId = s[1].replace(".J", "");
log.info("调度任务 --> taskId: " + taskId);
}
}
}Quartz调度器
@Component
@Slf4j
public class QuartzManager {
@Resource
SchedulerFactoryBean schedulerFactory;
@Resource
private Scheduler scheduler;
/**
* @param id
* @param date
* @param type
* @return
*/
public Map<string string> addTaskJob(String id, Date date, String type) {
String cron = getCron(date);
log.info("cron事件表达式 --> " + cron);
Map<string string> map = setData(id);
if (Constant.TASK.equals(type)) {
addJob(map.get("jobName"), map.get("jobGroupName"), map.get("triggerName"), map.get("triggerGroupName"), TaskExecuteJob.class, cron);
}
return map;
}
public Map<string string> deleteTaskJob(String id) {
Map<string string> map = setData(id);
removeJob(map.get("jobName"), map.get("jobGroupName"), map.get("triggerName"), map.get("triggerGroupName"));
log.info("删除定时任务 --> " + map.get("jobName"));
return map;
}
public Map<string string> setData(String id) {
Map<string string> map = new HashMap(16);
map.put("jobName", "J_" + id);
map.put("jobGroupName", "G_" + id);
map.put("triggerName", "T_" + id);
map.put("triggerGroupName", "TG_" + id);
return map;
}
/**
* Date格式转成cron格式
*
* @param date Date事件
* @return cron格式
*/
private String getCron(Date date) {
StringBuilder sb = new StringBuilder();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
sb.append(calendar.get(Calendar.SECOND));
sb.append(" ");
sb.append(calendar.get(Calendar.MINUTE));
sb.append(" ");
sb.append(calendar.get(Calendar.HOUR_OF_DAY));
sb.append(" ");
sb.append(calendar.get(Calendar.DATE));
sb.append(" ");
sb.append(calendar.get(Calendar.MONTH) + 1);
sb.append(" ?");
return sb.toString();
}
/**
* 添加一个定时任务
*
* @param jobName 任务名
* @param jobGroupName 任务组名
* @param triggerName 触发器名
* @param triggerGroupName 触发器组名
* @param jobClass 任务
* @param cron 时间设置,参考quartz说明文档
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class jobClass, String cron) {
try {
scheduler = schedulerFactory.getScheduler();
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
TriggerBuilder<trigger> triggerBuilder = TriggerBuilder.newTrigger();
triggerBuilder.withIdentity(triggerName, triggerGroupName);
triggerBuilder.startNow();
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
CronTrigger trigger = (CronTrigger) triggerBuilder.build();
scheduler.scheduleJob(jobDetail, trigger);
if (!scheduler.isShutdown()) {
scheduler.start();
}
} catch (Exception e) {
log.info("添加任务出现异常!,{}", e.getMessage());
}
}
/**
* 修改一个任务的触发时间
*
* @param triggerName 触发器名
* @param triggerGroupName 触发器组名
* @param cron 时间设置,参考quartz说明文档
*/
public void modifyJobTime(String triggerName, String triggerGroupName, String cron) {
try {
scheduler = schedulerFactory.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
if (trigger == null) {
return;
}
String oldTime = trigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(cron)) {
TriggerBuilder<trigger> triggerBuilder = TriggerBuilder.newTrigger();
triggerBuilder.withIdentity(triggerName, triggerGroupName);
triggerBuilder.startNow();
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
trigger = (CronTrigger) triggerBuilder.build();
scheduler.rescheduleJob(triggerKey, trigger);
}
} catch (Exception e) {
log.info("修改任务出现异常!,{}", e.getMessage());
}
}
/**
* 移除一个任务
*
* @param jobName 任务名
* @param jobGroupName 任务组名
* @param triggerName 触发器名
* @param triggerGroupName 触发器组名
*/
public void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) {
try {
scheduler = schedulerFactory.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
scheduler.pauseTrigger(triggerKey);
scheduler.unscheduleJob(triggerKey);
scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));
} catch (Exception e) {
log.info("移除任务出现异常!,{}", e.getMessage());
}
}
}</trigger></trigger></string></string></string></string></string></string>今天关于《Quartz-任务进度管理器》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
版本声明
本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
WeMall商城16套价值74000元商用源码开放下载
- 上一篇
- WeMall商城16套价值74000元商用源码开放下载
- 下一篇
- 技术分享 | 回顾 MySQL 的 MTS
查看更多
最新文章
-
- 数据库 · MySQL | 1天前 |
- MySQL数值函数大全及使用技巧
- 117浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- 三种登录MySQL方法详解
- 411浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL数据备份方法与工具推荐
- 420浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL数据备份方法与工具推荐
- 264浏览 收藏
-
- 数据库 · MySQL | 4天前 |
- MySQL索引的作用是什么?
- 266浏览 收藏
-
- 数据库 · MySQL | 5天前 |
- MySQL排序原理与实战应用
- 392浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQLwhere条件查询技巧
- 333浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL常用数据类型有哪些?怎么选更合适?
- 234浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL常用命令大全管理员必学30条
- 448浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL高效批量插入数据方法大全
- 416浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL性能优化技巧大全
- 225浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL数据备份4种方法保障安全
- 145浏览 收藏
查看更多
课程推荐
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
查看更多
AI推荐
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3166次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3379次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3408次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4512次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3788次使用
查看更多
相关文章
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览
-
- B-Tree、B+Tree以及B-link Tree
- 2023-01-19 235浏览
-
- mysql面试题
- 2023-01-17 157浏览
-
- MySQL数据表简单查询
- 2023-01-10 101浏览

