1、导入jar包
2、applicationContext.xml配置
<!-- 调度工厂 -->
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
</bean>
3、任务调度
(一)添加任务
@SuppressWarnings("unchecked")
public void addJob(ScheduleJob job) throws SchedulerException {
{
if (job == null || !StaticParam.STATUS_RUNNING.equals(job.getStatus())) {
return;
}
Scheduler scheduler = schedulerFactoryBean.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 不存在,创建一个
if (null == trigger) {
Class<?> clazz = StaticParam.CONCURRENT_IS.equals(job.getIsConcurrent()) ? QuartzJobFactory.class : QuartzJobFactoryDisallowConcurrentExecution.class;
JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) clazz).withIdentity(job.getJobName(), job.getJobGroup()).build();
jobDetail.getJobDataMap().put("scheduleJob", job);
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCron());
trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup()).withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail, trigger);
} else {
// Trigger已存在,那么更新相应的定时设置
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCron());
// 按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
// 按新的trigger重新设置job执行
scheduler.rescheduleJob(triggerKey, trigger);
}
}
}
(二)立即执行任务
public void runAJobNow(ScheduleJob scheduleJob) throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
scheduler.triggerJob(jobKey);
}
(三)删除任务
public void deleteJob(ScheduleJob scheduleJob) throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
scheduler.deleteJob(jobKey);
}
(四)恢复任务
public void resumeJob(ScheduleJob scheduleJob) throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());
scheduler.resumeJob(jobKey);
try {
//数据操作-修改任务状态
scheduleJob.setStatus(StaticParam.STATUS_RUNNING);//恢复任务
scheduleJobDao.updateJobStatus(scheduleJob);
} catch (Exception e) {
e.printStackTrace();
}
}
4、相关类文件
QuartzJobFactoryDisallowConcurrentExecution.java
Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞。
@DisallowConcurrentExecution 禁止并发执行多个相同定义的JobDetail, 这个注解是加在Job类上的, 但意思并不是不能同时执行多个Job, 而是不能并发执行同一个Job Definition(由JobDetail定义), 但是可以同时执行多个不同的JobDetail。
@DisallowConcurrentExecution
public class QuartzJobFactoryDisallowConcurrentExecution implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
ScheduleJob scheduleJob = (ScheduleJob) context.getMergedJobDataMap().get("scheduleJob");
TaskUtils.invokMethod(scheduleJob);
}
}
QuartzJobFactory.java
计划任务执行无状态任务
public class QuartzJobFactory implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
ScheduleJob scheduleJob = (ScheduleJob) context.getMergedJobDataMap().get("scheduleJob");
TaskUtils.invokMethod(scheduleJob);
}
}
TaskUtils.java
public class TaskUtils {
public final static Logger logger = Logger.getLogger(TaskUtils.class);
/**
* 通过反射调用scheduleJob中定义的方法
*
* @param scheduleJob
*/
public static void invokMethod(ScheduleJob scheduleJob) {
Object object = null;
Class<?> clazz = null;
if (StringUtils.isNotBlank(scheduleJob.getBeanClass())) {
try {
clazz = Class.forName(scheduleJob.getBeanClass());
object = clazz.newInstance();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
if (object == null) {
logger.error("任务名称 = [" + scheduleJob.getJobName()
+ "]---------------未启动成功,请检查是否配置正确!!!");
return;
}
clazz = object.getClass();
Method method = null;
try {
method = clazz.getDeclaredMethod(scheduleJob.getMethodName());
} catch (NoSuchMethodException e) {
logger.error("任务名称 = [" + scheduleJob.getJobName()
+ "]---------------未启动成功,方法名设置错误!!!");
} catch (SecurityException e) {
logger.error(e.getMessage(), e);
}
if (method != null) {
try {
method.invoke(object);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
logger.debug("任务名称 = [" + scheduleJob.getJobName() + "]----------启动成功");
}
}
ScheduleJob.java
public class ScheduleJob extends BaseVo {
private static final long serialVersionUID = 1L;
/**任务id*/
private Integer jobId;
/**任务名称*/
private String jobName;
/**任务分组*/
private String jobGroup;
/**cron表达式*/
private String cron;
/**任务执行时调用哪个类的方法 包名+类名*/
private String beanClass;
/**是否有效*/
private Integer isConcurrent;
/**任务调用的方法名*/
private String methodName;
/**创建人ID*/
private Integer createUserId;
/**搜索条件:创建时间开始*/
private Date createTmBegin;
/**搜索条件:创建时间截止*/
private Date createTmEnd;
/**创建时间*/
private Date createTm;
/**修改人ID*/
private Integer updateUserId;
/**搜索条件:修改时间开始*/
private Date updateTmBegin;
/**搜索条件:修改时间截止*/
private Date updateTmEnd;
/**修改时间*/
private Date updateTm;
/**备注*/
private String remark;
/**状态*/
private Integer status;
public ScheduleJob(){
}
public ScheduleJob(
Integer jobId
){
this.jobId = jobId;
}
public void setJobId(Integer value) {
this.jobId = value;
}
public Integer getJobId() {
return this.jobId;
}
public void setJobName(String value) {
this.jobName = value;
}
public String getJobName() {
return this.jobName;
}
public void setJobGroup(String value) {
this.jobGroup = value;
}
public String getJobGroup() {
return this.jobGroup;
}
public void setCron(String value) {
this.cron = value;
}
public String getCron() {
return this.cron;
}
public void setBeanClass(String value) {
this.beanClass = value;
}
public String getBeanClass() {
return this.beanClass;
}
public void setIsConcurrent(Integer value) {
this.isConcurrent = value;
}
public Integer getIsConcurrent() {
return this.isConcurrent;
}
public void setMethodName(String value) {
this.methodName = value;
}
public String getMethodName() {
return this.methodName;
}
public void setCreateUserId(Integer value) {
this.createUserId = value;
}
public Integer getCreateUserId() {
return this.createUserId;
}
public String getCreateTmStr() {
try {
return new SimpleDateFormat("yyyy-MM-dd").format(this.createTm);
}catch(Exception e){
return null;
}
}
public void setCreateTmStr(String value) {
try {
this.createTm = new SimpleDateFormat("yyyy-MM-dd").parse(value);
} catch (Exception e) {
}
}
public Date getCreateTmBegin() {
return this.createTmBegin;
}
public void setCreateTmBegin(Date value) {
this.createTmBegin = value;
}
public String getCreateTmBeginStr() {
try {
return new SimpleDateFormat("yyyy-MM-dd").format(this.createTmBegin);
}catch(Exception e){
return null;
}
}
public void setCreateTmBeginStr(String value) {
try {
this.createTmBegin = new SimpleDateFormat("yyyy-MM-dd").parse(value);
} catch (Exception e) {
}
}
public Date getCreateTmEnd() {
return this.createTmEnd;
}
public void setCreateTmEnd(Date value) {
this.createTmEnd = value;
}
public String getCreateTmEndStr() {
try {
return new SimpleDateFormat("yyyy-MM-dd").format(this.createTmEnd);
}catch(Exception e){
return null;
}
}
public void setCreateTmEndStr(String value) {
try {
this.createTmEnd = new SimpleDateFormat("yyyy-MM-dd").parse(value);
} catch (Exception e) {
}
}
public void setCreateTm(Date value) {
this.createTm = value;
}
public Date getCreateTm() {
return this.createTm;
}
public void setUpdateUserId(Integer value) {
this.updateUserId = value;
}
public Integer getUpdateUserId() {
return this.updateUserId;
}
public String getUpdateTmStr() {
try {
return new SimpleDateFormat("yyyy-MM-dd").format(this.updateTm);
}catch(Exception e){
return null;
}
}
public void setUpdateTmStr(String value) {
try {
this.updateTm = new SimpleDateFormat("yyyy-MM-dd").parse(value);
} catch (Exception e) {
}
}
public Date getUpdateTmBegin() {
return this.updateTmBegin;
}
public void setUpdateTmBegin(Date value) {
this.updateTmBegin = value;
}
public String getUpdateTmBeginStr() {
try {
return new SimpleDateFormat("yyyy-MM-dd").format(this.updateTmBegin);
}catch(Exception e){
return null;
}
}
public void setUpdateTmBeginStr(String value) {
try {
this.updateTmBegin = new SimpleDateFormat("yyyy-MM-dd").parse(value);
} catch (Exception e) {
}
}
public Date getUpdateTmEnd() {
return this.updateTmEnd;
}
public void setUpdateTmEnd(Date value) {
this.updateTmEnd = value;
}
public String getUpdateTmEndStr() {
try {
return new SimpleDateFormat("yyyy-MM-dd").format(this.updateTmEnd);
}catch(Exception e){
return null;
}
}
public void setUpdateTmEndStr(String value) {
try {
this.updateTmEnd = new SimpleDateFormat("yyyy-MM-dd").parse(value);
} catch (Exception e) {
}
}
public void setUpdateTm(Date value) {
this.updateTm = value;
}
public Date getUpdateTm() {
return this.updateTm;
}
public void setRemark(String value) {
this.remark = value;
}
public String getRemark() {
return this.remark;
}
public void setStatus(Integer value) {
this.status = value;
}
public Integer getStatus() {
return this.status;
}
public String getStatusStr(){
return StaticParam.VALID.equals(status)?"已启动":"停止";
}
}