java中基于线层池Spring-quartz如何实现动态增删除改和暂停恢复定时任务
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要讲解了"java中基于线层池Spring-quartz如何实现动态增删除改和暂停恢复定时任务",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"
千家信息网最后更新 2026年11月02日java中基于线层池Spring-quartz如何实现动态增删除改和暂停恢复定时任务
这篇文章主要讲解了"java中基于线层池Spring-quartz如何实现动态增删除改和暂停恢复定时任务",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"java中基于线层池Spring-quartz如何实现动态增删除改和暂停恢复定时任务"吧!
注:本文中没有定时任务增删改查页面、保存数据库等操作的代码。根据实际需求自行完善
pom.xml
org.springframework spring-context-support 4.2.5.RELEASE org.quartz-scheduler quartz 2.2.1
spring-scheduler.xml
ApplicationContext.xml (spring配置文件)
ScheduleJobMode.java
package com.scheduler;import java.io.Serializable;import java.util.Date;/** * 定时任务mode */public class ScheduleJobMode implements Serializable { private static final long serialVersionUID = 1L; //任务调度参数key public static final String JOB_PARAM_KEY = "JOB_PARAM_KEY"; //任务id private String jobId; //spring bean名称 bean名称不能为空 private String beanName; //方法名 方法名称不能为空 private String methodName; //参数 private String params; //cron表达式 private String cronExpression; //任务状态 1:正常,2:暂停 private String status; //备注 private String remark; //创建者 private String createName; //创建时间 private Date createTime; //最近更新人 private String modifierName; //最近更新时间 private Date modifierTime; public void setJobId(String jobId) { this.jobId = jobId; } public String getJobId() { return jobId; } public String getBeanName() { return beanName; } public void setBeanName(String beanName) { this.beanName = beanName; } public String getMethodName() { return methodName; } public void setMethodName(String methodName) { this.methodName = methodName; } public String getParams() { return params; } public void setParams(String params) { this.params = params; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } public void setStatus(String status) { this.status = status; } public String getStatus() { return status; } public void setCron_Expression(String cronExpression) { this.cronExpression = cronExpression; } public String getCron_Expression() { return cronExpression; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getCreateTime() { return createTime; } public String getCreateName() { return createName; } public void setCreateName(String createName) { this.createName = createName; } public String getModifierName() { return modifierName; } public void setModifierName(String modifierName) { this.modifierName = modifierName; } public Date getModifierTime() { return modifierTime; } public void setModifierTime(Date modifierTime) { this.modifierTime = modifierTime; }}ScheduleJobLogMode.java
package com.scheduler;import java.io.Serializable;import java.util.Date;/** * 定时执行日志 */public class ScheduleJobLogMode implements Serializable { private static final long serialVersionUID = 1L; //日志id private String logId; //任务id private String jobId; //spring bean名称 private String beanName; //方法名 private String methodName; //参数 private String params; //任务状态 0:成功 1:失败 private String status; //失败信息 private String error; //耗时(单位:毫秒) private Integer times; //创建时间 private Date createTime; public String getLogId() { return logId; } public void setLogId(String logId) { this.logId = logId; } public String getJobId() { return jobId; } public void setJobId(String jobId) { this.jobId = jobId; } public String getBeanName() { return beanName; } public void setBeanName(String beanName) { this.beanName = beanName; } public String getMethodName() { return methodName; } public void setMethodName(String methodName) { this.methodName = methodName; } public String getParams() { return params; } public void setParams(String params) { this.params = params; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getError() { return error; } public void setError(String error) { this.error = error; } public Integer getTimes() { return times; } public void setTimes(Integer times) { this.times = times; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; }}ScheduleUtils.java
package com.scheduler;import com.wawj.fg.common.scheduler.ScheduleJob;import com.wawj.fg.common.scheduler.support.TaskSupport;import com.scheduler.ScheduleJobMode;import org.quartz.*;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * 定时任务工具类 */public class ScheduleUtils { private static final Logger logger = LoggerFactory.getLogger(ScheduleUtils.class); private static final String JOB_NAME = "TASK_"; /** * 获取触发器key */ public static TriggerKey getTriggerKey(String jobId) { return TriggerKey.triggerKey(JOB_NAME + jobId); } /** * 获取jobKey */ public static JobKey getJobKey(String jobId) { return JobKey.jobKey(JOB_NAME + jobId); } /** * 获取表达式触发器 */ public static CronTrigger getCronTrigger(Scheduler scheduler, String jobId) { try { return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId)); } catch (SchedulerException e) { logger.info("获取定时任务CronTrigger出现异常", e); return null; } } /** * 创建定时任务 */ public static void createScheduleJob(Scheduler scheduler, ScheduleJobMode scheduleJob) { try { //构建job信息 JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(scheduleJob.getJobId())).build(); //表达式调度构建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCron_Expression()) .withMisfireHandlingInstructionDoNothing(); //按新的cronExpression表达式构建一个新的trigger CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getJobId())).withSchedule(scheduleBuilder).build(); //放入参数,运行时的方法可以获取 jobDetail.getJobDataMap().put(ScheduleJobMode.JOB_PARAM_KEY, scheduleJob); scheduler.scheduleJob(jobDetail, trigger); //暂停任务 if (scheduleJob.getStatus().equals(TaskSupport.TASK_STATUS_STOPPED)) { pauseJob(scheduler, scheduleJob.getJobId()); } } catch (SchedulerException e) { logger.info("创建定时任务失败", e); } } /** * 更新定时任务 */ public static void updateScheduleJob(Scheduler scheduler, ScheduleJobMode scheduleJob) { try { TriggerKey triggerKey = getTriggerKey(scheduleJob.getJobId()); //表达式调度构建器 CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCron_Expression()) .withMisfireHandlingInstructionDoNothing(); CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getJobId()); if (null != trigger) { //按新的cronExpression表达式重新构建trigger trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); //参数 trigger.getJobDataMap().put(ScheduleJobMode.JOB_PARAM_KEY, scheduleJob); scheduler.rescheduleJob(triggerKey, trigger); //暂停任务 if (scheduleJob.getStatus().equals(TaskSupport.TASK_STATUS_STOPPED)) { pauseJob(scheduler, scheduleJob.getJobId()); } } else { throw new NullPointerException(); } } catch (SchedulerException e) { logger.info("更新定时任务失败", e); } } /** * 立即执行任务 */ public static void run(Scheduler scheduler, ScheduleJobMode scheduleJob) { try { //参数 JobDataMap dataMap = new JobDataMap(); dataMap.put(ScheduleJobMode.JOB_PARAM_KEY, scheduleJob); scheduler.triggerJob(getJobKey(scheduleJob.getJobId()), dataMap); } catch (SchedulerException e) { logger.info("立即执行定时任务失败", e); } } /** * 暂停任务 */ public static void pauseJob(Scheduler scheduler, String jobId) { try { scheduler.pauseJob(getJobKey(jobId)); } catch (SchedulerException e) { logger.info("暂停定时任务失败", e); } } /** * 恢复任务 */ public static void resumeJob(Scheduler scheduler, String jobId) { try { scheduler.resumeJob(getJobKey(jobId)); } catch (SchedulerException e) { logger.info("暂停定时任务失败", e); } } /** * 删除定时任务 */ public static void deleteScheduleJob(Scheduler scheduler, String jobId) { try { scheduler.deleteJob(getJobKey(jobId)); } catch (SchedulerException e) { logger.info("删除定时任务失败", e); } }}QuartzManager.java
package com.scheduler;import com.wawj.fg.common.scheduler.ScheduleUtils;import com.wawj.fg.model.baseinfo.scheduler.ScheduleJobMode;import org.quartz.CronTrigger;import org.quartz.Scheduler;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.quartz.SchedulerFactoryBean;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;import java.util.HashMap;import java.util.List;@Componentpublic class QuartzManager { @Autowired private SchedulerFactoryBean schedulerFactoryBean; /** * 项目启动时,初始化定时器 */ @PostConstruct public void init() { //查询保存到数据的定时任务,本文没有操作数据代码,可自行完善 List scheduleJobList = schedulerJobDao.queryList(new HashMap()); Scheduler scheduler = schedulerFactoryBean.getScheduler(); for (ScheduleJobMode scheduleJob : scheduleJobList) { CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getJobId()); //如果不存在,则创建 if (cronTrigger == null) { ScheduleUtils.createScheduleJob(scheduler, scheduleJob); } else { ScheduleUtils.updateScheduleJob(scheduler, scheduleJob); } } } /** * 创建定时器 */ public void createScheduleJob(ScheduleJobMode scheduleJob) { Scheduler scheduler = schedulerFactoryBean.getScheduler(); ScheduleUtils.createScheduleJob(scheduler, scheduleJob); } /** * 更新定时器 */ public void update(ScheduleJobMode scheduleJob) { Scheduler scheduler = schedulerFactoryBean.getScheduler(); ScheduleUtils.updateScheduleJob(scheduler, scheduleJob); } /** * 删除定时器 */ public void deleteBatch(String[] jobIds) { Scheduler scheduler = schedulerFactoryBean.getScheduler(); for (String jobId : jobIds) { ScheduleUtils.deleteScheduleJob(scheduler, jobId); } } /** * 立刻执行一下定时器 */ public void run(String[] jobIds) { Scheduler scheduler = schedulerFactoryBean.getScheduler(); for (String jobId : jobIds) { //queryObject(jobId) 是从数据库中查询出对象 ScheduleUtils.run(scheduler, queryObject(jobId)); } } /** * 暂停定时任务 */ public void pause(String[] jobIds) { Scheduler scheduler = schedulerFactoryBean.getScheduler(); for (String jobId : jobIds) { ScheduleUtils.pauseJob(scheduler, jobId); } } /** * 恢复定时任务 */ public void resume(String[] jobIds) { Scheduler scheduler = schedulerFactoryBean.getScheduler(); for (String jobId : jobIds) { ScheduleUtils.resumeJob(scheduler, jobId); } }} SpringUtils.java
package com.scheduler;import com.wawj.fg.util.SpringContextUtils;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;/** * Spring Context 工具类 */@Componentpublic class SpringUtils implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringContextUtils.applicationContext = applicationContext; } public static Object getBean(String name) { return applicationContext.getBean(name); } public static T getBean(String name, Class requiredType) { return applicationContext.getBean(name, requiredType); } public static boolean containsBean(String name) { return applicationContext.containsBean(name); } public static boolean isSingleton(String name) { return applicationContext.isSingleton(name); } public static Class extends Object> getType(String name) { return applicationContext.getType(name); }} ScheduleRunnable.java
package com.scheduler;import java.lang.reflect.Method;import org.apache.commons.lang.StringUtils;import org.apache.log4j.Logger;import org.springframework.util.ReflectionUtils;import com.scheduler;.SpringUtils;/** * 执行定时任务 */public class ScheduleRunnable implements Runnable { private static final Logger logger = Logger.getLogger(ScheduleRunnable.class); //类名 private Object target; //方法名 private Method method; //参数 private String params; public ScheduleRunnable(String beanName, String methodName, String params) throws NoSuchMethodException{ this.target = SpringUtils.getBean(beanName); this.params = params; if(StringUtils.isNotBlank(params)){ this.method = target.getClass().getDeclaredMethod(methodName, String.class); }else{ this.method = target.getClass().getDeclaredMethod(methodName); } } @Override public void run() { try { ReflectionUtils.makeAccessible(method); if(StringUtils.isNotBlank(params)){ method.invoke(target, params); }else{ method.invoke(target); } }catch (Exception e) { logger.error("执行定时任务失败",e); throw new RuntimeException(); } }}ScheduleJob.java
package com.scheduler;import com.wawj.fg.common.scheduler.ScheduleRunnable;import com.wawj.fg.model.baseinfo.scheduler.ScheduleJobLogMode;import com.wawj.fg.model.baseinfo.scheduler.ScheduleJobMode;import com.wawj.fg.service.baseinfo.scheduler.ScheduleJobLogService;import com.wawj.fg.util.SpringContextUtils;import com.wawj.fg.util.UUIDUtil;import org.apache.log4j.Logger;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.springframework.scheduling.quartz.QuartzJobBean;import java.util.Date;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;/** * 定时任务 */public class ScheduleJob extends QuartzJobBean { private static final Logger logger = Logger.getLogger(ScheduleJob.class); //创建线层池 (创建一个单线程化的线程池) private ExecutorService service = Executors.newSingleThreadExecutor(); @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { ScheduleJobMode scheduleJob = (ScheduleJobMode) context.getMergedJobDataMap() .get(ScheduleJobMode.JOB_PARAM_KEY); //获取spring bean ScheduleJobLogService scheduleJobLogService = (ScheduleJobLogService) SpringContextUtils.getBean("scheduleJobLogService"); //数据库保存执行记录 ScheduleJobLogMode log = new ScheduleJobLogMode(); log.setLogId(UUIDUtil.getUUID()); log.setJobId(scheduleJob.getJobId()); log.setBeanName(scheduleJob.getBeanName()); log.setMethodName(scheduleJob.getMethodName()); log.setParams(scheduleJob.getParams()); log.setCreateTime(new Date()); //任务开始时间 long startTime = System.currentTimeMillis(); try { //执行任务 logger.info("任务准备执行,任务ID:" + scheduleJob.getJobId()); ScheduleRunnable task = new ScheduleRunnable(scheduleJob.getBeanName(), scheduleJob.getMethodName(), scheduleJob.getParams()); Future> future = service.submit(task); future.get(); //任务执行总时长 long times = System.currentTimeMillis() - startTime; log.setTimes((int) times); //任务状态 0:成功 1:失败 log.setStatus("0"); logger.info("任务执行完毕,任务ID:" + scheduleJob.getJobId() + " 总共耗时:" + times + "毫秒"); } catch (Exception e) { logger.error("任务执行失败,任务ID:" + scheduleJob.getJobId(), e); //任务执行总时长 long times = System.currentTimeMillis() - startTime; log.setTimes((int) times); //任务状态 0:成功 1:失败 log.setStatus("1"); log.setError(scheduleJob.getBeanName() + "." + scheduleJob.getMethodName()); } finally { scheduleJobLogService.save(log); } }}感谢各位的阅读,以上就是"java中基于线层池Spring-quartz如何实现动态增删除改和暂停恢复定时任务"的内容了,经过本文的学习后,相信大家对java中基于线层池Spring-quartz如何实现动态增删除改和暂停恢复定时任务这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
任务
参数
表达式
定时器
数据
方法
更新
动态
名称
时间
状态
成功
数据库
学习
调度
代码
信息
内容
工具
日志
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
咖啡
与互联网科技公司
科技服务与互联网
互联网 科技创新
华宇互联网科技
猪兼强互联网科技
互联网科技公司电话
以房互联网科技
万易互联网科技有限公司
广州紫鲸互联网科技
互联网实体化科技化
互联网科技公司需要的职位
互联网教育科技公司vipkid
小米互联网科技园设置
以后互联网后是啥科技
中化能源互联网科技招聘
滨湖区互联网智能科技产品有哪些
互联网风格科技公司名称
陕西九四连强互联网科技有限公司
互联网科技收购价值
南京欣网互联网络科技有限公司
互联网科技的英文
互联网教育科技公司vipkid
互联网科技教育视频
互联网对科技的发展
江阴互联网智能科技产品进口
坤平互联网科技
群盈汇互联网科技有限公司
互联网风格科技公司名称
数字互联网科技有限公司