SpringBoot之Quartz实战
说明:由于上篇文章我们已经讨论过springboot整合Quartz及相关配置,本次我们只说明Qrtz的增、删、改、启动、停止相关api的使用,其中涉及的其他技术,如:mybatisplus等技术以后进行专题讨论。
阅读本篇文章,建议您先看上一篇文章:
定时任务操作
参数:job的类全路径、job所属组、job的执行时间(cron表达式),这里对这些参数进行封装为一个接收前端参数的QuartzVo,如下:
@Data
public class QuartzVo {
/**
* 定时任务类全称
*/
private String jobClassName;
/**
* 定时任务所属组
*/
private String jobGroupName;
/**
* cron 表达式
*/
private String cron;
}
编码
- controller 层
@Controller
public class JobController extends BaseController {
@Autowired
JobService jobService;
@Autowired
QrtzJobDetailsService qrtzJobDetailsService;
@RequestMapping({"", "/"})
public String index() {
return "/view/index";
}
@GetMapping("/query/jobs")
@ResponseBody
public Result query() {
List<QrtzJobDetails> list = qrtzJobDetailsService.list(new QueryWrapper<QrtzJobDetails>()
.eq("SCHED_NAME", "clusteredScheduler")
);
return Result.success(list);
}
@PostMapping("/job/add")
@ResponseBody
public Result addJob(@RequestBody QuartzVo quartzVo) throws Exception {
Result result = jobService.addJob(quartzVo.getJobClassName(), quartzVo.getJobGroupName(), quartzVo.getCron());
return result;
}
@PostMapping("/job/delete")
@ResponseBody
public Result deleteJob(@RequestBody QuartzVo quartzVo) throws SchedulerException {
Result result = jobService.deleteJob(quartzVo.getJobClassName(), quartzVo.getJobGroupName());
return result;
}
@PostMapping("/job/update")
@ResponseBody
public Result updateJob(@RequestBody QuartzVo quartzVo) throws SchedulerException {
Result result = jobService.updateJob(quartzVo.getJobClassName(), quartzVo.getJobGroupName(), quartzVo.getCron());
return result;
}
@PostMapping("/job/start")
@ResponseBody
public Result startJob(@RequestBody QuartzVo quartzVo) throws SchedulerException {
Result result = jobService.startJob(quartzVo.getJobClassName(), quartzVo.getJobGroupName());
return result;
}
@PostMapping("job/stop")
@ResponseBody
public Result stopJob(@RequestBody QuartzVo quartzVo) throws SchedulerException {
Result result = jobService.stopJob(quartzVo.getJobClassName(), quartzVo.getJobGroupName());
return result;
}
}
说明:controller层提供了一个查询定时任务的方法,其中用到的是mybatisplus的方法,后续我们专门出一个专题来聊这个技术。再往下就是定时任务的增、删、改、启动、暂停。几乎每一个方法都写了详细的注释大家直接看代码就行可以。
Result是我们统一返回给前端的数据封装,方便前端同学统一获取数据。
Result类代码
@Data
public class Result implements Serializable {
// 0成功,-1失败
private int status;
private String msg;
private Object data;
public static Result success() {
return Result.success("操作成功", null);
}
public static Result success(Object data) {
return Result.success("操作成功", data);
}
public static Result success(String msg, Object data) {
Result result = new Result();
result.status = 0;
result.msg = msg;
result.data = data;
return result;
}
public static Result fail(String msg) {
Result result = new Result();
result.status = -1;
result.data = null;
result.msg = msg;
return result;
}
}
- serviceImpl 代码
@Service
public class JobServiceImpl implements JobService {
@Autowired
Scheduler scheduler;
/**
* 新增job任务
*
* @param jobName job名称
* @param jobGroupName job分组名称
* @param cron cron 表达式
* @throws SchedulerException
*/
public Result addJob(String jobName, String jobGroupName, String cron) throws Exception {
//构建job信息
JobDetail jobDetail = JobBuilder.newJob(getClass(jobName).getClass()).withIdentity(jobName, jobGroupName).build();
//cron表达式调度器构建
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
//构建 Trigger
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName).withSchedule(scheduleBuilder).build();
Date date = scheduler.scheduleJob(jobDetail, cronTrigger);
if (date==null){
return Result.fail("添加定时任务失败");
}
return Result.success();
}
/**
* 删除定时任务
*
* @param jobName 任务名称
* @param jobGroup 任务分组
* @throws SchedulerException
*/
public Result deleteJob(String jobName, String jobGroup) throws SchedulerException {
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup);
scheduler.pauseTrigger(triggerKey);
scheduler.unscheduleJob(triggerKey);
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
boolean deleteJob = scheduler.deleteJob(jobKey);
if (deleteJob){
return Result.fail("删除定时任务失败");
}
return Result.success();
}
/**
* 修改定时任务
*
* @param jobName job名称
* @param jobGroupName job分组名称
* @param cron cron 表达式
*/
public Result updateJob(String jobName, String jobGroupName, String cron) throws SchedulerException {
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
//重新构建表达式trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
Date date = scheduler.rescheduleJob(triggerKey, trigger);
if (date==null){
return Result.fail("添加定时任务失败");
}
return Result.success();
}
/**
* 启动定时任务
* @param jobClassName 任务名称
* @param jobGroupName 任务所属组
* @return
* @throws SchedulerException
*/
@Override
public Result startJob(String jobClassName, String jobGroupName) throws SchedulerException {
scheduler.resumeJob(JobKey.jobKey(jobClassName,jobGroupName));
return Result.success();
}
/**
* 停止定时任务
* @param jobClassName 任务名称
* @param jobGroupName 任务所属组
* @return
* @throws SchedulerException
*/
@Override
public Result stopJob(String jobClassName, String jobGroupName) throws SchedulerException {
scheduler.pauseJob(JobKey.jobKey(jobClassName,jobGroupName));
return Result.success();
}
private BaseJob getClass(String jobName) throws Exception {
Class<?> class1 = Class.forName(jobName);
return (BaseJob) class1.newInstance();
}
}
说明:增加定时任务,首先我们需要开发一个你的业务定时任务,在这里我们进行查询数据库中现在处在的定时任务。
创建基础定时任务接口
我们创建一个基础定时任务接口类BaseJob
继承Job
实现方法execute
,代码如下:
public interface BaseJob extends Job {
@Override
void execute(JobExecutionContext context) throws JobExecutionException;
}
创建业务定时类:实现我们的基础定时接口类
@Component
@Slf4j
public class MyJob implements BaseJob {
@Autowired
QrtzJobDetailsService qrtzJobDetailsService;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("定时任务以启动");
List<QrtzJobDetails> list = qrtzJobDetailsService.list(new QueryWrapper<QrtzJobDetails>()
.eq("SCHED_NAME", "clusteredScheduler")
);
System.out.println(list);
System.out.println("定时任务执行时间"+new Date());
}
}
说明:其中的方法就是进行查询数据库库中现在存在的定时任务,并输出到控制台。
测试
添加定时任务
我们用postman进行接口测试。
显示操作成功,由于添加完成定时任务后,定时任务就会启动,我们来看控制台
定时任务在开始执行,并且查询出来了我们刚添加的定时任务信息。
由于我设置的是一分钟执行一次,接下来我们测试暂停定时任务;
还是利用postman进行测试
定时任务已经暂停:
下面的其他方法就不一一进行测试了,感兴趣的铜须可以自己测试一下。相关代码已经上传到本人的github
地址:https://github.com/triumphxx/spring-boot-quartz.git
SpringBoot之Quartz实战的更多相关文章
- Springboot集成Quartz
之前学习过spring的定时任务 :https://www.cnblogs.com/slimshady/p/10112515.html 本文主要学习记录下springboot使用quartz 1. ...
- SpringBoot整合Quartz定时任务 系统job Spring Boot教程 调度任务
原文地址:https://www.cnblogs.com/allalongx/p/8477368.html 构建工程 创建一个Springboot工程,在它的程序入口加上@EnableScheduli ...
- springboot和quartz整合实现动态定时任务(持久化单节点)
Quartz是一个完全由java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制,它支持定时任务持久化到数据库,从而避免了重启服务器时任务丢失,支持分布式多节点,大大的 ...
- SpringBoot整合Quartz作为调度中心完整实用例子
因为想要做一个类似于调度中心的东西,定时执行一些Job(通常是一些自定义程序或者可执行的jar包),搭了一个例子,总结了前辈们的相关经验和自己的一些理解,如有雷同或不当之处,望各位大佬见谅和帮忙指正. ...
- SpringBoot整合Quartz定时任务
记录一个SpringBoot 整合 Quartz 的Demo实例 POM.XML文件 <!-- 定时器任务 quartz需要导入的坐标 --> <dependency> < ...
- Quartz实战
https://my.oschina.net/yinxiaoling/blog/542336?fromerr=s3ko7u33 Quartz实战 > 一.内存型(1) <bean name ...
- Jmeter实时监控+SpringBoot接口性能实战
性能测试 Jmeter实时监控+SpringBoot接口性能实战 自动化 SpringBoot Java Jmeter实时监控+SpringBoot接口性能实战 一.实验目的及实验环境 1.1.实验目 ...
- SpringBoot集成Quartz实现定时任务
1 需求 在我的前后端分离的实验室管理项目中,有一个功能是学生状态统计.我的设计是按天统计每种状态的比例.为了便于计算,在每天0点,系统需要将学生的状态重置,并插入一条数据作为一天的开始状态.另外,考 ...
- SpringBoot整合Quartz及log4j实例
SpringBoot整合Quartz及log4j实例 因为之前项目中经常会做一些定时Job的东西,所以在此记录一下,目前项目中已经使用elastic-job,这个能相对比Quartz更加简单方便一些, ...
随机推荐
- AutoJS 实现QQ小游戏胡莱三国爬塔
AutoJS 开发文档参考 环境 安卓QQ 胡莱三国小游戏 AutoJS APP 使用方法 安装AutoJs,打开无障碍模式,进入到胡莱三国小游戏,在Autojs中执行脚本 代码 "auto ...
- scrapy 基础组件专题(六):自定义命令
写好自己的爬虫项目之后,可以自己定制爬虫运行的命令. 一.单爬虫 在项目的根目录下新建一个py文件,如命名为start.py,写入如下代码: from scrapy.cmdline import ex ...
- Mysql----左连接、右连接、内连接、全连接的区别
最近,突然想起来数据库有好些时间没用到,所以,想把数据库有关的知识回顾一下,所以接下来这个月,基本上会以数据库的帖子来写为主,首先,很多同学都会有个错觉,觉得学习数据库会sql语句的增删改查就够了,其 ...
- ArcGIS 10.2安装及卸载教程
卸载 在控制面板中找到程序->卸载程序 找到ArcGIS的相关软件 这里以ArcGIS 10.2 Destop为例,选中,然后点击卸载,会出现如下界面 选择Remove,然后根据提示进行操作,即 ...
- python发送邮件插件
github链接:https://github.com/573734817pc/SendEmailPlug-in.git 说明: 1.该插件功能为发送邮件. 2.基于python编写. 3.使用的时候 ...
- selenium自动化测试实战——12306铁路官网范例
一.Selenium介绍 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Se ...
- [spring] -- AOP、IOC、DI篇
AOP(面向切面编程) 怎么理解这个切面编程的概念及优点? 概念: 横切关注点与业务逻辑相分离,切面能帮助我们模块化横切关注点: 优点: 现在每个关注点都集中于一个地方,而不是分散到多处代码中: 服务 ...
- APP自动化 -- 框架
一.框架源码 https://github.com/jiangnan27/Autotest_APP_Open 二.框架环境 python3 + appium1.15.3 + pytest5.3.5 三 ...
- F - Maximal Intersection --------暴力求解题
You are given n segments on a number line; each endpoint of every segment has integer coordinates. S ...
- Java环境变量设置:Path、CLASSPATH、JAVA_HOME的作用分别是什么?
1.Path 作用是指定命令搜索路径,在i命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找百看是否能找到相应的命令程序. 需要把jdk安装目录下的b ...