博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Quartz2.x动态Job工具类
阅读量:5874 次
发布时间:2019-06-19

本文共 8634 字,大约阅读时间需要 28 分钟。

hot3.png

有些需求,需要动态启动一个定时器,然后在一定条件下再停止。比如通过rest控制jenkins做发布,当发起一个构建后,就需要定时去查询构建状态,在构建完成后再停止定时器,下面是一个通用的定时器工具类。

pom.xml

4.0.0
com.scc
stu-quartz
0.0.1-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
1.5.9.RELEASE
org.apache.maven.plugins
maven-compiler-plugin
1.8
1.8
src/main/resources
**/*
src/main/java
**/*.xml
**/*.properties
org.springframework.boot
spring-boot-starter-web
log4j-over-slf4j
org.slf4j
org.quartz-scheduler
quartz
2.2.3
commons-lang
commons-lang
2.6
org.slf4j
slf4j-log4j12
com.google.guava
guava
21.0
org.springframework
spring-context
org.springframework
spring-context-support
org.springframework
spring-tx

接口

package com.scc.quartz;import java.util.Map;import org.quartz.Job;/** * @ClassName: IQuartzManager * @Description: TODO(这里用一句话描述这个类的作用) * @author shangchengcai@voole.com * @date 2017年4月18日 下午3:48:50 *  */public interface IQuartzManager {	/**	 * 	 * @Title: addJob	 * @Description: TODO(这里用一句话描述这个方法的作用)	 * @author shangchengcai@voole.com	 * @date 2017年4月18日 下午3:49:09	 * @param job_key	 * @param cls	 * @param delay 单位分钟	 * @param interval 单位秒	 * @param args	 * @return	 */	boolean addAndStartJob(String job_key, Class
cls, Integer delay, Integer interval, Map
args); /** * * @Title: deleteJob * @Description: TODO(这里用一句话描述这个方法的作用) * @author shangchengcai@voole.com * @date 2017年4月18日 下午3:49:16 * @param job_key * @return */ boolean deleteJob(String job_key);}

实现

package com.scc.quartz.impl;import java.util.Date;import java.util.Map;import org.apache.commons.lang.StringUtils;import org.quartz.Job;import org.quartz.JobBuilder;import org.quartz.JobDetail;import org.quartz.JobKey;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.SimpleScheduleBuilder;import org.quartz.SimpleTrigger;import org.quartz.TriggerBuilder;import org.quartz.TriggerKey;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.quartz.SchedulerFactoryBean;import org.springframework.stereotype.Service;import com.google.common.base.Preconditions;import com.scc.quartz.IQuartzManager;/** * @ClassName: QuartzManagerImpl * @Description: TODO(这里用一句话描述这个类的作用) * @author shangchengcai@voole.com * @date 2017年9月30日 下午2:26:12 *  */@Servicepublic class QuartzManagerImpl implements IQuartzManager {	private static final Logger LOGGER = LoggerFactory.getLogger(QuartzManagerImpl.class);	@Autowired	private SchedulerFactoryBean schedulerFactoryBean;	private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";	/*	 * (非 Javadoc) 

Title: addJob

Description:

* * @param job_key * * @param cls * * @param delay * * @param interval * * @param args * * @see com.voole.datacheck.util.quartz.IQuartzManager#addJob(java.lang.String, java.lang.Class, java.lang.String, * java.util.Map) */ @Override public boolean addAndStartJob(String job_key, Class
cls, Integer delay, Integer interval, Map
args) { LOGGER.info("add job:jobName-" + job_key + ",cls-" + cls + ",delay-" + delay); Preconditions.checkArgument(StringUtils.isNotBlank(job_key), "jobName can not be null"); Preconditions.checkArgument(cls != null, "cls can not be null"); try { JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(job_key, JOB_GROUP_NAME).build();// 任务名,任务组,任务执行类 jobDetail.getJobDataMap().putAll(args); // 触发器 TriggerKey triggerKey = TriggerKey.triggerKey(job_key, JOB_GROUP_NAME); // 表达式调度构建器 SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(interval).repeatForever(); // .withRepeatCount(0); Long currentdatetime = System.currentTimeMillis(); Date rundate = new Date(currentdatetime + ((null == delay ? 60 : delay) * 60 * 1000)); SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).startAt(rundate) .withSchedule(scheduleBuilder).build(); this.getScheduler().scheduleJob(jobDetail, trigger); return true; } catch (Exception e) { LOGGER.error("", e); e.printStackTrace(); } return false; } /** * @Title: getScheduler * @Description: TODO(这里用一句话描述这个方法的作用) * @author shangchengcai@voole.com * @date 2017年4月18日 下午5:43:52 * @return */ private Scheduler getScheduler() { return this.schedulerFactoryBean.getScheduler(); } /* * (非 Javadoc)

Title: deleteJob

Description:

* * @param job_key * * @return * * @see com.voole.datacheck.util.quartz.IQuartzManager#deleteJob(java.lang.String) */ @Override public boolean deleteJob(String job_key) { LOGGER.info("deleteJob:job_name-" + job_key); Preconditions.checkArgument(StringUtils.isNotBlank(job_key), "jobName can not be null"); JobKey jobKey = JobKey.jobKey(job_key, JOB_GROUP_NAME); try { if (this.getScheduler().checkExists(jobKey)) { this.getScheduler().pauseJob(jobKey); this.getScheduler().deleteJob(jobKey); } return true; } catch (SchedulerException e) { LOGGER.error("", e); e.printStackTrace(); } return false; }}

配置

package com.scc.conf;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.quartz.SchedulerFactoryBean;/** * @ClassName: XMLConfig * @Description: TODO(这里用一句话描述这个类的作用) * @author shangchengcai@voole.com * @date 2017年9月6日 下午3:45:47 *  */@Configurationpublic class Config {	/**	 * 	 * @Title: schedulerFactoryBean	 * @Description: TODO(这里用一句话描述这个方法的作用)	 * @author chengcai.shang@cmgplex.com	 * @date 2018年9月14日 上午9:33:24	 * @return	 */	@Bean	public SchedulerFactoryBean schedulerFactoryBean() {		return new SchedulerFactoryBean();	}}

启动类

package com.scc;import java.util.HashMap;import java.util.Map;import javax.annotation.Resource;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.scc.demojob.DemoJob;import com.scc.quartz.IQuartzManager;/** * @ClassName: Application * @Description: TODO(这里用一句话描述这个类的作用) * @author shangchengcai@voole.com * @date 2017年9月7日 上午9:50:19 *  */@SpringBootApplication@Controllerpublic class Application {	@Resource	private IQuartzManager quartzManager;	@RequestMapping("/start")	@ResponseBody	public String testStart() {		Map
args = new HashMap<>(); args.put("args1", "args1"); args.put("args2", "args2"); args.put("args3", "args3"); args.put("args4", "args4"); this.quartzManager.addAndStartJob("test", DemoJob.class, 0, 5, args); return "success"; } @RequestMapping("/stop") @ResponseBody public String testStop() { this.quartzManager.deleteJob("test"); return "success"; } @RequestMapping("/killSelf") @ResponseBody public String testKillSelf() { Map
args = new HashMap<>(); args.put("quartzManager", this.quartzManager); this.quartzManager.addAndStartJob("test", DemoJob.class, 0, 5, args); return "success"; } public static void main(String[] args) { SpringApplication.run(Application.class, args); }}

接口说明

总共有三个接口,start、stop、killSelf。顾名思义,前两个略过,最后一个是在启动后,判断是否具备停止条件,一但具备就停止当前定时。

具体代码见https://github.com/shang7053/base/tree/master/stu-quartz

转载于:https://my.oschina.net/shyloveliyi/blog/2051251

你可能感兴趣的文章
阿里云CentOS搭建系统
查看>>
git rebase
查看>>
TeaWeb v0.1.1 发布,优化缓存策略和其他细节
查看>>
svn 服务器搭建 (Linux)
查看>>
SpringBlade 2.0.1 发布,兼容jdk11与openjdk,增加Saber代码生成功能
查看>>
Cisco ISO 计划命令 kron实现配置定时自动备份
查看>>
rpm 相关问题
查看>>
PE结构讲解--section table 和 section
查看>>
主DNS服务-反向解析
查看>>
车联网上云最佳实践(七)
查看>>
70种方法,轻松入门Python可视化编程
查看>>
AIF娱乐完成数千万人民币Pre-A轮融资 计划年底推出第一支男子偶像团体
查看>>
Java 程序员必会的技术
查看>>
[Flink]Flink1.3 Batch指南一 本地运行
查看>>
1小时轻松上手springmvc,视频网站后台开发
查看>>
.NET Core 使用RabbitMQ
查看>>
zookeeper小入门(一)
查看>>
美摄科技获数千万元Pre-A 轮融资,深创投投资
查看>>
laravel为啥这么的慢?
查看>>
SSM-Spring-11:Spring中使用代理工厂Bean实现aop的四种增强
查看>>