quartz配置动态任务,从数据库读取相应的类及方法,执行任务(任务添加、修改、暂停、恢复)

界面

步骤:首先创建一个javabean---》创建Quartz工厂---》xmlSchedulerFactoryBean---》配置通过反射机制---》执行相应的service

1、bean

package com.oppo.common.quartz;/*** quartz任务类* @author xuchangcheng* 2018年8月24日**/
public class ScheduleJob {/** 任务id */private String jobId;/** 任务名称 */private String jobName;/** 任务分组 */private String jobGroup;/** 任务状态 0禁用 1启用 2删除*/private String jobStatus;/** 任务运行时间表达式 */private String cronExpression;/** 任务描述 */private String desc;/** 类全城 */private String classPath;/** 方法名 */private String methodName;public ScheduleJob() {super();}public String getJobId() {return jobId;}public void setJobId(String jobId) {this.jobId = jobId;}public String getJobName() {return jobName;}public void setJobName(String jobName) {this.jobName = jobName;}public String getJobGroup() {return jobGroup;}public void setJobGroup(String jobGroup) {this.jobGroup = jobGroup;}public String getJobStatus() {return jobStatus;}public void setJobStatus(String jobStatus) {this.jobStatus = jobStatus;}public String getCronExpression() {return cronExpression;}public void setCronExpression(String cronExpression) {this.cronExpression = cronExpression;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}public String getClassPath() {return classPath;}public void setClassPath(String classPath) {this.classPath = classPath;}public String getMethodName() {return methodName;}public void setMethodName(String methodName) {this.methodName = methodName;}}

2、工厂(如图是在web端应用,所以都是通过注入的形式获取相应的bean)

package com.oppo.common.quartz;import java.lang.reflect.Method;import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.PersistJobDataAfterExecution;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ReflectionUtils;import com.oppo.common.global.listener.WebContextListener;
import com.oppo.common.tools.StringUtils;/*** QuartzJob工厂* @author xuchangcheng* 2018年8月24日**/
@PersistJobDataAfterExecution
public class QuartzJobFactory implements Job {private static final Logger logger = LoggerFactory.getLogger(QuartzJobFactory.class);@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {ScheduleJob scheduleJob = (ScheduleJob) context.getMergedJobDataMap().get("scheduleJob");Class<?> clazz;try {clazz = Class.forName(scheduleJob.getClassPath());String className = StringUtils.firstToLower(clazz.getSimpleName());Object bean = (Object)WebContextListener.getBean(className);Method method = ReflectionUtils.findMethod(bean.getClass(), scheduleJob.getMethodName());ReflectionUtils.invokeMethod(method, bean);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}logger.info("----------定时开始----------");}}

3、xml

<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:task="http://www.springframework.org/schema/task"xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-4.0.xsd  http://www.springframework.org/schema/mvc  http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsdhttp://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-4.0.xsd"><!-- ===================================== 日志定时任务  ===================================== --><!-- 日志任务配置:task任务扫描注解 --><context:annotation-config />  <!-- 日志任务配置:task任务扫描注解 --><task:annotation-driven /> <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" /></beans>

4、任务添加

/*** 开启定时任务* @param id*/public void startQurtaz(String id){//定时任务调度Scheduler scheduler = (Scheduler)WebContextListener.getBean("schedulerFactoryBean");Map<String,Object> map = qurtaztDao.findById(id);ScheduleJob scheduleJob = new ScheduleJob();scheduleJob.setClassPath(map.get("job_class").toString());scheduleJob.setMethodName(map.get("job_method").toString());scheduleJob.setJobName(map.get("job_name").toString());scheduleJob.setCronExpression(map.get("job_cron").toString());scheduleJob.setJobStatus(map.get("job_status").toString());TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName());CronTrigger trigger;try {trigger = (CronTrigger) scheduler.getTrigger(triggerKey);} catch (SchedulerException e1) {e1.printStackTrace();}JobDetail jobDetail = JobBuilder.newJob(QuartzJobFactory.class).withIdentity(scheduleJob.getJobName()).build();jobDetail.getJobDataMap().put("scheduleJob", scheduleJob);//表达式调度构建器CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());//按新的cronExpression表达式构建一个新的triggertrigger = TriggerBuilder.newTrigger().withIdentity(scheduleJob.getJobName()).withSchedule(scheduleBuilder).build();try {scheduler.scheduleJob(jobDetail, trigger);} catch (SchedulerException e) {e.printStackTrace();}}

5、任务修改

/*** 更新定时任务* @param id*/public void updateQurtazTime(String id){//定时任务调度Scheduler scheduler = (Scheduler)WebContextListener.getBean("schedulerFactoryBean");Map<String,Object> map = qurtaztDao.findById(id);ScheduleJob scheduleJob = new ScheduleJob();scheduleJob.setClassPath(map.get("job_class").toString());scheduleJob.setMethodName(map.get("job_method").toString());scheduleJob.setJobName(map.get("job_name").toString());scheduleJob.setCronExpression(map.get("job_cron").toString());TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName());CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());CronTrigger trigger;try {trigger = (CronTrigger) scheduler.getTrigger(triggerKey);//按新的cronExpression表达式重新构建triggertrigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();//按新的trigger重新设置job执行scheduler.rescheduleJob(triggerKey, trigger);} catch (SchedulerException e) {e.printStackTrace();}}

6、任务暂停

/*** 暂停定时任务* @param id*/public void pauseQurtazTask(String id){Scheduler scheduler = (Scheduler)WebContextListener.getBean("schedulerFactoryBean");Map<String,Object> map = qurtaztDao.findById(id);ScheduleJob scheduleJob = new ScheduleJob();scheduleJob.setClassPath(map.get("job_class").toString());scheduleJob.setMethodName(map.get("job_method").toString());scheduleJob.setJobName(map.get("job_name").toString());scheduleJob.setCronExpression(map.get("job_cron").toString());JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName());try {scheduler.pauseJob(jobKey);} catch (SchedulerException e) {e.printStackTrace();}}

7、任务恢复

/*** 恢复定时任务* @param id*/public void resumeQurtazTask(String id){Scheduler scheduler = (Scheduler)WebContextListener.getBean("schedulerFactoryBean");Map<String,Object> map = qurtaztDao.findById(id);ScheduleJob scheduleJob = new ScheduleJob();scheduleJob.setClassPath(map.get("job_class").toString());scheduleJob.setMethodName(map.get("job_method").toString());scheduleJob.setJobName(map.get("job_name").toString());scheduleJob.setCronExpression(map.get("job_cron").toString());JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName());try {scheduler.resumeJob(jobKey);} catch (SchedulerException e) {e.printStackTrace();}}

8、任务删除

/*** 删除定时任务* @param id*/public void deleteQurtazTask(String id){Scheduler scheduler = (Scheduler)WebContextListener.getBean("schedulerFactoryBean");Map<String,Object> map = qurtaztDao.findById(id);ScheduleJob scheduleJob = new ScheduleJob();scheduleJob.setClassPath(map.get("job_class").toString());scheduleJob.setMethodName(map.get("job_method").toString());scheduleJob.setJobName(map.get("job_name").toString());scheduleJob.setCronExpression(map.get("job_cron").toString());JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName());try {scheduler.deleteJob(jobKey);} catch (SchedulerException e) {e.printStackTrace();}}

参数中的id为数据库中获取的任务id,如图

有喜欢的朋友可以关注下头条号《老徐聊技术》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/352803.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】-自动化构建工具(make/makefile)

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 文章目录 前言 前言 今天我们来讲讲再Linux中开发必备的一项技能&#xff0c;没有这个…

BERT中的黑暗秘密

点击上方“AI公园”&#xff0c;关注公众号&#xff0c;选择加“星标“或“置顶” 作者&#xff1a;Anna Rogers 编译&#xff1a;ronghuaiyang 导读 在finetune BERT的时候发生了什么&#xff1f; 这篇博客文章总结了我们EMNLP 2019年的论文“Revealing the Dark Secrets of B…

计算机竞赛游戏探险岛,冒险岛2主线任务攻略_第三章主线任务图文攻略

冒险岛2现已开启终极内测&#xff0c;很多玩家可能不知道主线任务怎么做&#xff0c;下面为大家带来冒险岛2第三章主线任务攻略(第三章&#xff1a;特别的任务)&#xff0c;一起来看看吧&#xff01; *冒险岛2第三章主线任务攻略 接下来要继续更新的&#xff0c;是冒险岛2主线任…

《黑暗之光》RPG游戏案例学习(8)——第四章 游戏任务系统

游戏任务系统 任务界面任务的接受与完成&#xff08;1&#xff09;点击NPC时&#xff0c;出现任务描述&#xff08;2&#xff09;接受任务后&#xff0c;出现任务提示&#xff08;3&#xff09;完成任务后&#xff0c;提交获取奖励 其他设计添加按钮音效鼠标指针管理系统 参考&…

黑暗逃生服务器显示无,《黑暗逃生》常见问题解决方法 游戏进不去?

本款游戏被称作一款3D版的狼人杀游戏&#xff0c;最近有很多玩家开始游玩这个游戏了&#xff0c;但是相对的游戏时常会出现些小问题&#xff0c;接下来小编就给大家带来这篇黑暗逃生常见问题解决方法&#xff0c;不要错过哦。 常见问题解决教程 1、游戏无法运行&#xff1a;“-…

黑暗逃生服务器显示无,《黑暗逃生》常见问题 已知问题及解决方案

今天发号哥和大家讲解《黑暗逃生》常见问题 已知问题及解决方案 黑暗逃生常见问题解决由发号哥小编给大家带来&#xff0c;大家在玩黑暗逃生的时候一定会遇到一些问题吗&#xff0c;小编给大家整合了黑暗逃生已知问题及解决方案&#xff0c;感兴趣的玩家一起来看看吧。 传奇最经…

RPG游戏《黑暗之光》流程介绍与代码分析之(四):任务系统的实现

第四章&#xff1a;任务系统 这部分主要对任务系统进行设计&#xff0c;游戏的关键因素之一就是任务系统与玩家的交互&#xff0c;但在代码实现中并不算复杂。本篇博客主要通过一下几个方面实现任务系统。 任务模型的导入与任务UI界面的创建任务的接受与完成针对不同对象的指针…

GoodTask 6.6.0 计划提醒任务管理工具

GoodTask是一款基于Apple提醒和日历、功能强大的任务/项目管理工具。它既可以用作简单的待办事项检查列表&#xff0c;也可以用作复杂的项目管理工具&#xff0c;帮助完成重大项目。GoodTask让您通过各种不同的视角来观看自己关注且需要完成的事务。有了GoodTask&#xff0c;您…

超黑光摄像机可以有多“黑“?

目前&#xff0c;市场标准黑光级IPC能在0.0005Lux(照度单位)的低照下维持彩色&#xff0c;但星光级或普通红外条件则必须依赖补光灯。那么有没有一款摄像机能达到超黑光的标准&#xff0c;能够在更暗环境下&#xff0c;不需要额外补光的情况下维持彩色呢&#xff1f; 超低照成像…

如何处理亿级图片排重(精准排重,相似排重)

图片相似度对比 1、需求 假如有一个图片池&#xff0c;存有1亿图片。给一张目标图片&#xff0c;在图片池中做匹配。 判断一张图片是否在图片池中出现过。&#xff08;完全一样&#xff09;判断有没有相似的出现过。比如两张图相似度90&#xff0c;两张图片是在描述一件事情。 …

【初识Spring框架】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 1. Spring框架是什么&#xff1f; 2. IOC 容器…

mDNS实现之Bonjour与Avahi(二)——win/linux/arm交叉编译

0.Part1&#xff1a; mDNS实现之Bonjour与Avahi&#xff08;一&#xff09;——win/linux/arm交叉编译_平凡之路-CSDN博客官网&#xff1a;Bonjour - Apple Developerhttps://developer.apple.com/bonjour/1.WindowsBonjour SDK for Windowshttps://developer.apple.com/downlo…

Android Says Bonjour

转载自&#xff1a; https://blog.csdn.net/innost/article/details/8629139 Android Says Bonjour 很高兴能在农历蛇年刚开始的这期《程序员》杂志上继续为读者奉上Android的故事。初来咋到&#xff0c;首先要向大家说声”你好“。有意思的是&#xff0c;Android也很通人情&a…

iOS 之 Bonjour 协议简单抓包分析

引子 因在学习iOS编程之bonjour编程的过程中&#xff0c;对bonjour产生了一些些的好奇&#xff0c;因此就查 阅了各种资料以及自己抓包分析该协议。 注&#xff1a;文章作为个人学习记录&#xff0c;不一定准确&#xff0c;如有错误请多多指教&#xff0c;共同进步&#xff01;…

1.7 基于XML配置方式使用Spring MVC

一、基于XML配置与注解的方式使用Spring MVC 1、创建Maven项目 Maven项目 - SpringMvcDemo01 单击【Finish】按钮 2、添加相关依赖 在pom.xml文件里添加支持Spring MVC的相关依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmln…

硬件工程师-BOOST升压电源设计

一、Boost变换原理 开关闭合时&#xff0c;电感电压等于输入电压 开关断开时&#xff0c;电感电压输出电压-输入电压&#xff0c; 电感的感生电动势&#xff0c;N ΔΦ磁通的变化率&#xff0c;Δt时间 假设开关闭合与开关断开&#xff0c;开关断开时能量全部释放光 将第三个式…

【Python】深度理解Class类、Object类、Type元类的概念和关系

深度理解Class类、Object类、Type元类 1.Class类、Object类、Type元类的表面关系2.Class、Object、Type解释3.关系详解4.那么如何看待object、type在Python面对对象概念中的一席之地呢&#xff1f;5.那么object、type扮演了什么样的角色呢&#xff1f;他们对class又分别做了什么…

MongoDB(学习笔记1.0)

最近在学非关系型数据库MongoDB&#xff0c;猛地用起来的真的没关系型数据库方便啊。 首先还是数据库的安装&#xff1a; 安装直接去官网安装即可&#xff0c;官网地址&#xff1a;MongoDB: The Developer Data Platform | MongoDB 当前也有免安装版的&#xff0c;这里就不再…

京东数据分析软件工具(京东618销量查询)

这一期&#xff0c;我们主要分享今年618京东美妆的预售数据&#xff0c;包括面部护肤、香水彩妆、男士面部护肤品类。 -面部护肤- 今年618&#xff0c;面部护肤品类在京东累计预售量达到130万件&#xff0c;预售额达到13亿元。预售期间&#xff0c;护肤品类均价在1010元左右。期…

Android 使用第三方字体

先看下图 一.全局替换方式 1.新建assets引入资源 2. 自定义application&#xff0c;将第三方的字体&#xff0c;替换当前系统默认字体 class App : Application() {override fun onCreate() {super.onCreate()initTypeface()}private fun initTypeface() {val typefaceByson…