关于使用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时候的 ...
随机推荐
- RTMP协议规范(转载)
译序: 本文是为截至发稿时止最新 Adobe 官方公布的 RTMP 规范.本文包含 RTMP 规范的全部内容.是第一个比较全面的 RTMP 规范的中译本.由于成文时间仓促,加上作者知识面所限,翻译错误 ...
- ORCAD元件属性白色区域和黄色区域的理解
白色部分为instance属性,黄色部分为occurence 属性 在平坦式电路中,黄色部分是默认不显示的. 在层次式电路中,黄色部分会显示. 如果这两个区域的Reference不同,以黄色 ...
- 【转载】FAT32文件系统详解
硬盘是用来存储数据的,为了使用和管理方便,这些数据以文件的形式存储在硬盘上.任何操作系统都有自己的文件管理系统,不同的文件系统又有各自不同的逻辑组织方式.例如:常见的文件系统有FAT,NTFS,EXT ...
- 看完此文,妈妈还会担心你docker入不了门?
本文在个人技术博客不同步发布,详情可猛戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 上周对象突然心血来潮说想养个小宠物,我问想养啥她又说随便,你看着办!!!这我 ...
- 新一代AJAX API:FETCH
AJAX半遮半掩的底层API是饱受诟病的一件事情. XMLHttpRequest 并不是专为Ajax而设计的. 虽然各种框架对 XHR 的封装已经足够好用, 但我们可以做得更好.更好用的API是 fe ...
- eclipse的debug使用(转载)
出处:http://www.blogjava.net/yxhxj2006/archive/2012/08/30/386621.html 远程Debug: http://blog.sina.com.cn ...
- jquery 效果网址分享
http://www.lanrentuku.com/js/ http://www.baidu.com/link?url=2nuImAliKGCKyDeJ7ln2DR_2if5uKgr-em6a3dx ...
- vue web开发
https://www.szzhdj.gov.cn/js/pagejs/assemblyHall_dzs1.js https://www.szzhdj.gov.cn/js/pagejs/assembl ...
- Qt JSON解析生成笔记
对于这样一段json { "name": "布衣食", "gender": "Male", "age" ...
- thinkphp3.2独立分组的建立
很简单,就是把默认的Home模块复制一份,放到Admin目录下,同时把namespace改成namespace Admin\Controller即可,配置项如下: