说明:由于上篇文章我们已经讨论过springboot整合Quartz及相关配置,本次我们只说明Qrtz的增、删、改、启动、停止相关api的使用,其中涉及的其他技术,如:mybatisplus等技术以后进行专题讨论。

阅读本篇文章,建议您先看上一篇文章:

SpringBoot整合Quartz实现任务定时

定时任务操作

参数: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实战的更多相关文章

  1. Springboot集成Quartz

    之前学习过spring的定时任务 :https://www.cnblogs.com/slimshady/p/10112515.html 本文主要学习记录下springboot使用quartz 1.   ...

  2. SpringBoot整合Quartz定时任务 系统job Spring Boot教程 调度任务

    原文地址:https://www.cnblogs.com/allalongx/p/8477368.html 构建工程 创建一个Springboot工程,在它的程序入口加上@EnableScheduli ...

  3. springboot和quartz整合实现动态定时任务(持久化单节点)

    Quartz是一个完全由java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制,它支持定时任务持久化到数据库,从而避免了重启服务器时任务丢失,支持分布式多节点,大大的 ...

  4. SpringBoot整合Quartz作为调度中心完整实用例子

    因为想要做一个类似于调度中心的东西,定时执行一些Job(通常是一些自定义程序或者可执行的jar包),搭了一个例子,总结了前辈们的相关经验和自己的一些理解,如有雷同或不当之处,望各位大佬见谅和帮忙指正. ...

  5. SpringBoot整合Quartz定时任务

    记录一个SpringBoot 整合 Quartz 的Demo实例 POM.XML文件 <!-- 定时器任务 quartz需要导入的坐标 --> <dependency> < ...

  6. Quartz实战

    https://my.oschina.net/yinxiaoling/blog/542336?fromerr=s3ko7u33 Quartz实战 > 一.内存型(1) <bean name ...

  7. Jmeter实时监控+SpringBoot接口性能实战

    性能测试 Jmeter实时监控+SpringBoot接口性能实战 自动化 SpringBoot Java Jmeter实时监控+SpringBoot接口性能实战 一.实验目的及实验环境 1.1.实验目 ...

  8. SpringBoot集成Quartz实现定时任务

    1 需求 在我的前后端分离的实验室管理项目中,有一个功能是学生状态统计.我的设计是按天统计每种状态的比例.为了便于计算,在每天0点,系统需要将学生的状态重置,并插入一条数据作为一天的开始状态.另外,考 ...

  9. SpringBoot整合Quartz及log4j实例

    SpringBoot整合Quartz及log4j实例 因为之前项目中经常会做一些定时Job的东西,所以在此记录一下,目前项目中已经使用elastic-job,这个能相对比Quartz更加简单方便一些, ...

随机推荐

  1. POJ3263 Tallest Cow 差分

    题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a p ...

  2. Vue数据检监测问题

    vue.js是通过数据劫持的方式实现数据的双向绑定的,其中过程如下: 当把一个JavaScript对象传给Vue实例的data选项时,Vue会遍历此对象的所有属性并使用 Object.definePr ...

  3. Jmeter系列(33)- 跨平台运行 Jmeter,CSV 文件路径如何设置?

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 抛出问题 上一篇文章中详细讲解了 CS ...

  4. python分块读取大数据,避免内存不足

  5. 数据可视化之powerBI技巧(二十三)Power BI可视化技巧,使用DAX自定义时间轴

    ​按照自然日历来展现疫情数据时,是这样的效果, 由于各个国家的疫情爆发时间不一致,按自然日期坐标轴很难比较各个国家的蔓延速度. 如果各个国家都从蔓延日开始统计,展示之后每日的确诊人数,就是同样的时间轴 ...

  6. 数据分析05 /pandas的高级操作

    数据分析05 /pandas的高级操作 目录 数据分析05 /pandas的高级操作 1. 替换操作 2. 映射操作 3. 运算工具 4. 映射索引 / 更改之前索引 5. 排序实现的随机抽样/打乱表 ...

  7. EF实现简单的增删改查

    1.在项目中添加ADO.NET实体数据模型: 2.接着根据提示配置数据库连接,配置完毕之后项目中生成了大致如下的内容(EF6.x): 其中TestData.tt中的Consumer,Stores是创建 ...

  8. bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换*&&bzoj1692[Usaco2007 Dec]队列变换*

    bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换 bzoj1692[Usaco2007 Dec]队列变换 题意: 有一个奶牛队列.每次可以在原来队列的首端或是尾端牵出 ...

  9. Python+selenium+unittest+HTMLTestReportCN单元测试框架分享

    分享一个比较基础的,系统性的知识点.Python+selenium+unittest+HTMLTestReportCN单元测试框架分享 Unittest简介 unittest是Python语言的单元测 ...

  10. 第一讲 Windows10系统下IDE-CLion的安装与配置

    01 为什么使用CLion?02 CLion安装方法03 CLion的基本使用04 课程形式及答疑说明 toc 参考链接: Window10上CLion极简配置教程 学生免费注册Pycharm专业版 ...