关于使用quartz动态增删改定时任务
1. 首先, 还是喜闻乐见的导包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2. 处理schedule工具
package com.hoolink.schedule.util; import com.hoolink.sdk.bo.device.ScreenPlayScheduleBO;
import com.hoolink.sdk.utils.JSONUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.quartz.*; import java.time.LocalDate;
import java.util.List; /**
* @author <a herf="mailto:yanwu0527@163.com">XuBaofeng</a>
* @date 2019-05-31 17:29.
* <p>
* description:
* DisallowConcurrentExecution: 不允许并发执行
*/
@Slf4j
@DisallowConcurrentExecution
public class ScreenPlayUtil { /**
* 批量创建定时任务
*
* @param scheduler
* @param screens
*/
public static void createAll(Scheduler scheduler, List<ScreenPlayScheduleBO> screens) {
if (CollectionUtils.isEmpty(screens)) {
return;
}
screens.forEach(screen -> {
createJob(scheduler, screen);
});
} /**
* 添加一个定时任务
*
* @param scheduler 调度器
* @param screen 任务
*/
public static void createJob(Scheduler scheduler, ScreenPlayScheduleBO screen) {
try {
log.info("create job, time: {}, screen: {}", LocalDate.now(), screen);
Class<? extends Job> clazz = (Class<? extends Job>) Class.forName(screen.getClassName());
JobDataMap jobDataMap = new JobDataMap(JSONUtils.stringToMap(JSONUtils.toJSONString(screen)));
// 任务名,任务组,任务执行类
JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(screen.getJobName(), screen.getJobGroup())
.withDescription("定时任务").setJobData(jobDataMap).build();
// 触发器名,触发器组
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(screen.getCronExpression())
.withMisfireHandlingInstructionDoNothing();
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(screen.getTriggerName(), screen.getTriggerGroup())
.withDescription(screen.getDescription()).withSchedule(scheduleBuilder).startNow().build();
// 触发器时间设定
scheduler.scheduleJob(jobDetail, trigger);
// 启动
if (!scheduler.isShutdown()) {
startJobs(scheduler);
}
} catch (Exception e) {
log.error("create schedule job error", e);
}
} /**
* 批量更新定时任务
*
* @param scheduler
* @param screens
*/
public static void updateAll(Scheduler scheduler, List<ScreenPlayScheduleBO> screens) {
if (CollectionUtils.isEmpty(screens)) {
return;
}
screens.forEach(screen -> {
updateJob(scheduler, screen);
});
} /**
* 修改一个任务的触发时间
*
* @param scheduler
* @param screen
*/
public static void updateJob(Scheduler scheduler, ScreenPlayScheduleBO screen) {
try {
log.info("update job, time: {}, screen:{}", LocalDate.now(), screen);
TriggerKey triggerKey = new TriggerKey(screen.getTriggerName(), screen.getTriggerGroup());
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
if (trigger == null) {
createJob(scheduler, screen);
return;
}
String cron = trigger.getCronExpression();
if (!cron.equalsIgnoreCase(screen.getCronExpression())) {
removeJob(scheduler, screen);
createJob(scheduler, screen);
}
} catch (Exception e) {
log.error("update schedule job error", e);
}
} /**
* 清除所有的定时任务
*
* @param scheduler
*/
public static void removeAll(Scheduler scheduler) {
try {
log.info("remove all schedule job, time: {}", LocalDate.now());
scheduler.clear();
} catch (Exception e) {
log.error("remove all schedule job error.", e);
}
} /**
* 批量清除指定的定时任务
*
* @param scheduler
*/
public static void removeAll(Scheduler scheduler, List<ScreenPlayScheduleBO> screens) {
if (CollectionUtils.isEmpty(screens)) {
return;
}
screens.forEach(screen -> {
removeJob(scheduler, screen);
});
} /**
* 移除一个任务
*
* @param scheduler
* @param screen
*/
public static void removeJob(Scheduler scheduler, ScreenPlayScheduleBO screen) {
try {
log.info("remove job, time: {}, screen:{}", LocalDate.now(), screen);
JobKey jobKey = new JobKey(screen.getJobName(), screen.getJobGroup());
TriggerKey triggerKey = new TriggerKey(screen.getTriggerName(), screen.getTriggerGroup());
// 停止触发器
scheduler.pauseTrigger(triggerKey);
// 移除触发器
scheduler.unscheduleJob(triggerKey);
// 删除任务
scheduler.deleteJob(jobKey);
} catch (Exception e) {
log.error("remove schedule job error", e);
}
} /**
* 启动所有定时任务
*
* @param scheduler 调度器
*/
public static void startJobs(Scheduler scheduler) {
try {
log.info("start schedule job, time: {}", LocalDate.now());
scheduler.start();
} catch (Exception e) {
log.error("start schedule job error", e);
}
} /**
* 关闭所有定时任务
*
* @param scheduler 调度器
*/
public static void shutdownJobs(Scheduler scheduler) {
try {
log.info("shutdown schedule job, time: {}", LocalDate.now());
if (!scheduler.isShutdown()) {
scheduler.shutdown();
}
} catch (Exception e) {
log.error("shutdown schedule job error", e);
}
} }
3. BO
package com.hoolink.sdk.bo.device; import lombok.Data; import java.io.Serializable; /**
* @author <a herf="mailto:yanwu0527@163.com">XuBaofeng</a>
* @date 2019-05-31 17:31.
* <p>
* description:
*/
@Data
public class ScreenPlayScheduleBO implements Serializable {
private static final long serialVersionUID = 4226193119686522141L; private Long configId; /*** 执行任务的类名称 */
private String className; /*** 定时任务表达式 */
private String cronExpression; /*** 任务名称 */
private String jobName; /*** 任务分组 */
private String jobGroup; /*** 触发器名称 */
private String triggerName; /*** 触发器分组 */
private String triggerGroup; /*** 任务描述 */
private String description; /*** 创建时间 */
private Long createTime; /*** 定时任务任务ID */
private Long playId; /*** 开启\关闭(0:关闭;1:开启) */
private Boolean playStatus;
}
5. 处理定时任务
package com.hoolink.schedule.job; import com.hoolink.schedule.consumer.ScreenClient;
import com.hoolink.sdk.bo.device.ScreenPlayScheduleBO;
import com.hoolink.sdk.utils.JSONUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.servicecomb.foundation.common.utils.BeanUtils;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; import java.time.LocalDateTime; /**
* @author <a herf="mailto:yanwu0527@163.com">XuBaofeng</a>
* @date 2019-05-31 17:29.
* <p>
* description:
* DisallowConcurrentExecution: 不允许并发执行
*/
@Slf4j
@DisallowConcurrentExecution
public class ScreenPlayJob implements Job { @Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap jobDataMap = context.getMergedJobDataMap();
ScreenPlayScheduleBO mediaTaskBO = JSONUtils.parse(JSONUtils.toJSONString(jobDataMap), ScreenPlayScheduleBO.class);
log.info("screen play control job start, time: {} param: {}", LocalDateTime.now(), mediaTaskBO);
ScreenClient screenClient = BeanUtils.getContext().getBean(ScreenClient.class);
screenClient.playControl(mediaTaskBO);
} }
6. 调用schedule工具
package com.hoolink.schedule.controller; import com.hoolink.schedule.util.ScreenPlayUtil;
import com.hoolink.sdk.annotation.LogAndParam;
import com.hoolink.sdk.bo.BackBO;
import com.hoolink.sdk.bo.device.ScreenPlayScheduleBO;
import com.hoolink.sdk.utils.BackBOUtil;
import io.swagger.annotations.ApiOperation;
import org.apache.servicecomb.provider.rest.common.RestSchema;
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.List; /**
* @author <a herf="mailto:yanwu0527@163.com">XuBaofeng</a>
* @date 2019-06-01 14:59.
* <p>
* description:
*/
@RestController
@RequestMapping("/screen/play/")
@RestSchema(schemaId = "screenPlayController")
public class ScreenPlayController {
@Autowired
private Scheduler scheduler; @PostMapping(value = "create")
@ApiOperation(value = "创建定时任务")
@LogAndParam(value = "创建定时任务失败")
public BackBO<Void> create(@RequestBody ScreenPlayScheduleBO screen) {
ScreenPlayUtil.createJob(scheduler, screen);
return BackBOUtil.defaultBackBO();
} @PostMapping(value = "createAll")
@ApiOperation(value = "批量创建定时任务")
@LogAndParam(value = "批量定时任务失败")
public BackBO<Void> createAll(@RequestBody List<ScreenPlayScheduleBO> screens) {
ScreenPlayUtil.createAll(scheduler, screens);
return BackBOUtil.defaultBackBO();
} @PostMapping(value = "update")
@ApiOperation(value = "更新定时任务")
@LogAndParam(value = "更新定时任务失败")
public BackBO<Void> update(@RequestBody ScreenPlayScheduleBO screen) {
ScreenPlayUtil.updateJob(scheduler, screen);
return BackBOUtil.defaultBackBO();
} @PostMapping(value = "updateAll")
@ApiOperation(value = "更新定时任务")
@LogAndParam(value = "更新定时任务失败")
public BackBO<Void> updateAll(@RequestBody List<ScreenPlayScheduleBO> screens) {
ScreenPlayUtil.updateAll(scheduler, screens);
return BackBOUtil.defaultBackBO();
} @PostMapping(value = "remove")
@ApiOperation(value = "删除定时任务")
@LogAndParam(value = "删除定时任务失败")
public BackBO<Void> remove(@RequestBody ScreenPlayScheduleBO screen) {
ScreenPlayUtil.removeJob(scheduler, screen);
return BackBOUtil.defaultBackBO();
} @PostMapping(value = "deleteAll")
@ApiOperation(value = "清除所有的定时任务")
@LogAndParam(value = "清除所有的定时任务失败")
public BackBO<Void> deleteAll() {
ScreenPlayUtil.removeAll(scheduler);
return BackBOUtil.defaultBackBO();
} @PostMapping(value = "removeAll")
@ApiOperation(value = "清除所有的定时任务")
@LogAndParam(value = "清除所有的定时任务失败")
public BackBO<Void> removeAll(@RequestBody List<ScreenPlayScheduleBO> screens) {
ScreenPlayUtil.removeAll(scheduler, screens);
return BackBOUtil.defaultBackBO();
} }
关于使用quartz动态增删改定时任务的更多相关文章
- 实现Quartz的动态增删改查
1. Maven依赖 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId> ...
- SSM 整合 quartz JDBC方式实现job动态增删改查记录
虽然网上有很多资料,但是都不够系统,本文记录下自己的整合过程. 1. 搭建一个SSM项目,此处略. 2. 按照quartz官方要求,建立quartz相关的数据库和表,相关sql语句如下: /* Nav ...
- jquery表格动态增删改及取数据绑定数据完整方案
一 前言 上一篇Jquery遮罩插件,想罩哪就罩哪! 结尾的预告终于来了. 近期参与了一个针对内部员工个人信息收集的系统,其中有一个需求是在填写各个相关信息时,需要能动态的增加行当时公司有自己的解决方 ...
- jQuery动态增删改查表格信息,可左键/右键提示
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JavaScript动态增删改表格数据
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- mybatis的动态增删改查
1.动态SQL片段 通过SQL片段达到代码复用 <!-- 动态条件分页查询 --> <sql id="sql_count"> select count(*) ...
- fullcalendar日历插件的使用并动态增删改查
我上个项目是做了一个关于教育方面的web端页面,其中的课程表就要用到fullcalendar日历插件,刚开始也是不会用,因为以前也没用过,后面也是看官方文档,问同事,最后完成了这个课程表,个人感觉fu ...
- BootStrap table动态增删改表格内数据
1:添加一个[操作]列 { title: "操作", align: 'center', valign: 'middle', width: 160, // 定义列的宽度,单位为像 ...
- 使用BindingList来实现DataGridview数据源为list时的动态增删改
当DataGridview的数据源list的时候,对list进行操作后重新绑定,数据并不会更新 使用BindingList能很好的解决这个问题(framework2.0新增) 例如,使用list时候的 ...
随机推荐
- laravel 将数组转化成字符串 再把字符串转化成数组
这是在给阮少翔改代码的时候用的方法, 开始的数据用explored转化成数组不是想要的结果, 我就自己写了一个方法把有用的信息提取出来拼接成一个字符串, 再用explored将字符串转化成数组. ...
- mysql-介绍、MySQL部署、数据类型、存储引擎
数据库介绍 什么是数据? 数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材.数据是信息的表现形式和载体,可以是符号.文字.数字.语音.图像.视频等. ...
- poj 1703 Find them, Catch them(种类并查集和一种巧妙的方法)
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 36176 Accepted: ...
- React项目结构
任何一种语言.框架,在真正上手的时候,多多少少会想想怎么安排项目结构(正所谓磨刀不误砍柴工),React也不例外. google了下,拿下面3篇博客来说道说道. (1) how-to-better-o ...
- php中屏蔽date的错误
php中添加 date_default_timezone_set('asia/shanghai'); 可以屏蔽 <?php echo date('Y-m-d',$row3['time']); ...
- poj1125--Floyd
题解: 有N个股票经济人能够互相传递消息.他们之间存在一些单向的通信路径.如今有一个消息要由某个人開始传递给其它全部人.问应该由哪一个人来传递,才干在最短时间内让全部人都接收到消息. 显然,用Floy ...
- android开发——自己定义相机(Camera)开发总结
近期这段时间我一直在开发自己定义相机.谷歌了些网上的demo.发现有非常多各种各样的问题.终于还是从API的camera类開始学习,进行改进. 以下对之前的实现进行一些总结. 官方camera API ...
- contentprovider基础
程序启动后,只要再manifest当中注册上,就会执行PersonProvider()创建一个对象
- 04-树4 是否同一棵二叉搜索树(25 point(s)) 【Tree】
04-树4 是否同一棵二叉搜索树(25 point(s)) 给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和 ...
- Intellij IDEA 修改代码后自动编译更新
Intellij IDEA 一些不为人知的技巧 问题描述: Intellij IDEA 调试修改时,改动页面和 java 文件后,无法立刻看到变化,需要手动重启服务. 问题原因: 在 IDEA tom ...