工具类
import com.cnsuning.bdes.common.WeekEnum;
import org.apache.commons.lang.StringUtils;
import org.quartz.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
@Component
public class JobUtil {
private static final Logger logger = LoggerFactory.getLogger(JobUtil.class);
/**
*
* 功能描述: <br>
* 新增Cron调度任务(不立即执行)
*
* @param scheduler
* @param triggerGroupName 触发器组名
* @param triggerName 触发器名
* @param jobGroupName 任务组名
* @param jobName 任务名
* @param jobClass 任务的类类型
* @param cronTime 时间设置 表达式
* @param triggerStartTime 触发器开始时间
* @param paramsMap 参数
* @throws SchedulerException
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public static void addCronScheduleJob(Scheduler scheduler, String triggerGroupName, String triggerName,String jobGroupName, String jobName, Class<? extends Job> jobClass, String cronTime, Date triggerStartTime,Map<String, Object> paramsMap, int hours) throws SchedulerException {
logger.info("addCronScheduleJob: triggerGroupName{},triggerName{}", triggerGroupName, triggerName);
Trigger trigger = scheduler.getTrigger(TriggerKey.triggerKey(triggerName, triggerGroupName));
if (null == trigger) {
// 创建任务
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
// 参数设置
jobDetail.getJobDataMap().putAll(paramsMap);
if (hours > 0) {
// simple
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.repeatHourlyForever(hours).withMisfireHandlingInstructionNextWithExistingCount();
// 创建触发器
trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName).startAt(triggerStartTime).withSchedule(scheduleBuilder).build();
} else {
// corn
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronTime).withMisfireHandlingInstructionDoNothing();
// 创建触发器
trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName).startAt(triggerStartTime).withSchedule(scheduleBuilder).build();
}
// 将触发器和任务绑定到调度器内
scheduler.scheduleJob(jobDetail, trigger);
// 启动任务
/*
* if (!scheduler.isShutdown()) { scheduler.start(); }
*/
logger.info("Quartz created CronJob: {} ", jobDetail.getKey());
} else {
logger.info("job: {} already exist, don't need add new !!!", trigger.getKey());
}
}
/**
*
* 功能描述: <br>
* 新增Simple调度任务(不立即执行)
*
* @param scheduler
* @param triggerGroupName 触发器组名
* @param triggerName 触发器名
* @param jobGroupName 任务组名
* @param jobName 任务名
* @param jobClass 任务的类类型
* @param triggerStartTime 触发器开始时间
* @param paramsMap 参数
* @throws SchedulerException
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public static void addSimpleScheduleJob(Scheduler scheduler, String triggerGroupName, String triggerName,
String jobGroupName, String jobName, Class<? extends Job> jobClass, Date triggerStartTime,
Map<String, Object> paramsMap, int hours, int repeatCount) throws SchedulerException {
logger.info("addCronScheduleJob: triggerGroupName:{},triggerName:{}", triggerGroupName, triggerName);
Trigger trigger = scheduler.getTrigger(TriggerKey.triggerKey(triggerName, triggerGroupName));
if (null == trigger) {
// 创建任务
// requestRecovery 执行中应用发生故障,需要重新执行
// storeDurably 即使没有Trigger关联时,也不需要删除该JobDetail
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).requestRecovery()
.storeDurably().build();
// 参数设置
jobDetail.getJobDataMap().putAll(paramsMap);
// simple
SimpleScheduleBuilder scheduleBuilder = null;
if (repeatCount > 0) {
scheduleBuilder = SimpleScheduleBuilder.repeatHourlyForTotalCount(repeatCount, hours)
.withMisfireHandlingInstructionNextWithExistingCount();
} else {
scheduleBuilder = SimpleScheduleBuilder.repeatHourlyForever(hours)
.withMisfireHandlingInstructionNextWithExistingCount();
}
// 创建触发器
trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName).startAt(triggerStartTime)
.withSchedule(scheduleBuilder).build();
// 将触发器和任务绑定到调度器内
scheduler.scheduleJob(jobDetail, trigger);
// 启动任务
/*
* if (!scheduler.isShutdown()) { scheduler.start(); }
*/
logger.info("Quartz created SimpleJob: {} ", jobDetail.getKey());
} else {
logger.info("job: {} already exist, don't need add new !!!", trigger.getKey());
}
}
/**
*
* 功能描述: <br>
* 删除任务
*
* @param
* @return
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public static void deleteSchedulerJob(Scheduler scheduler, String triggerGroupName, String triggerName,String jobGroupName, String jobName) throws SchedulerException {
JobKey jobKey = new JobKey(jobName, jobGroupName);
// 判断对应的job是否存在
if (scheduler.checkExists(jobKey)) {
// 存在,删除
if (scheduler.deleteJob(jobKey)) {
logger.info("job:[{}-{}] delete success !!!", jobGroupName, jobName);
} else {
logger.error("job:[{}-{}] delete failed, please check it !!!", jobGroupName, jobName);
throw new SchedulerException("deleteSchedulerJob failed, please check it !!!");
}
} else {
logger.warn("job:[{}-{}] not exist, please check it !!!", jobName, jobGroupName);
return;
}
}
/**
*
* 功能描述: <br>
* 更新触发器时间
*
* @param
* @return
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public static void updateCronTriggerTime(Scheduler scheduler, String triggerGroupName, String triggerName,
String newCronTime, Date triggerStartTime, int hours) throws SchedulerException {
logger.info("updateCronTriggerTime: triggerGroupName{},triggerName{}", triggerGroupName, triggerName);
Trigger trigger = scheduler.getTrigger(TriggerKey.triggerKey(triggerName, triggerGroupName));
if (trigger == null) {
logger.warn("cronTrigger:[{}-null] not exist !!!", triggerGroupName);
return;
}
if (hours > 0) {
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
triggerBuilder.withIdentity(triggerName, triggerGroupName);
triggerBuilder.startAt(triggerStartTime);
// simple
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.repeatHourlyForever(hours)
.withMisfireHandlingInstructionNextWithExistingCount();
// 创建触发器
triggerBuilder.withSchedule(scheduleBuilder);
trigger = (SimpleTrigger) triggerBuilder.build();
scheduler.rescheduleJob(TriggerKey.triggerKey(triggerName, triggerGroupName), trigger);
logger.info("Simple updateCronTriggerTime: triggerStartTime{}", triggerStartTime);
} else {
CronTrigger cornTrigger = (CronTrigger) trigger;
String oldTime = cornTrigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(newCronTime)) {
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
triggerBuilder.withIdentity(triggerName, triggerGroupName);
triggerBuilder.startAt(triggerStartTime);
// corn
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(newCronTime)
.withMisfireHandlingInstructionDoNothing();
triggerBuilder.withSchedule(scheduleBuilder);
cornTrigger = (CronTrigger) triggerBuilder.build();
scheduler.rescheduleJob(TriggerKey.triggerKey(triggerName, triggerGroupName), cornTrigger);
logger.info("updateCronTriggerTime: old(){} -> new(){}", oldTime, newCronTime);
} else {
logger.warn("cronTrigger:[{}-{}] time samle, don't need update !!! ", triggerGroupName, cornTrigger);
}
}
}
/**
*
* 功能描述: <br>
* Cron表达式的格式:秒 分 时 日 月 周 年(可选)
*
* @param startTime 任务起始时间
* @param cycle 执行周期
* @return
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public static String getCronExpression(Date startTime, String cycle) {
String cronExpression = "";
if (null != startTime) {
// 当前时间所属周几
Calendar c = Calendar.getInstance();
c.setTime(startTime);
int day = c.get(Calendar.DAY_OF_MONTH);
int week = c.get(Calendar.DAY_OF_WEEK);
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
if ("天".equals(cycle)) {
cronExpression = second + " " + minute + " " + hour + " ? * *";
}
if ("周".equals(cycle)) {
cronExpression = second + " " + minute + " " + hour + " ? * " + week;
}
if ("15天".equals(cycle)) {
cronExpression = second + " " + minute + " " + hour + " */15 * ?";
}
if ("月".equals(cycle)) {
cronExpression = second + " " + minute + " " + hour + " " + day + " * ?";
}
if (!CronExpression.isValidExpression(cronExpression)) {
cronExpression = "";
}
}
return cronExpression;
}
/**
*
* 功能描述: <br>
* 〈功能详细描述〉
*
* @param startTime 23:11
* @param cycle 每日、周一、周二。。。。。。
* @return
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public static String getCronExpressionByCycle(String startTime, String cycle) {
String cronExpression = "";
if (StringUtils.isNotBlank(startTime) && StringUtils.isNotBlank(cycle)) {
// startTime转换 成时分秒
int hour = 0;
int minute = 0;
int second = 0;
if (startTime.length() > 5) {
second = Integer.parseInt(startTime.substring(5, 6));
}
if (startTime.length() > 3) {
minute = Integer.parseInt(startTime.substring(3, 5));
}
if (startTime.length() > 2) {
hour = Integer.parseInt(startTime.substring(0, 2));
}
String week = WeekEnum.getCode(cycle);
if (StringUtils.isNotBlank(week)) {
cronExpression = second + " " + minute + " " + hour + " ? * " + week;
} else {
cronExpression = second + " " + minute + " " + hour + " ? * *";
}
if (!CronExpression.isValidExpression(cronExpression)) {
cronExpression = "";
}
}
return cronExpression;
}
/**
*
* 功能描述: <br>
* 判断Job是否存在
*
* @param scheduler
* @param jobGroupName
* @param jobName
* @throws SchedulerException
* @see [相关类/方法](可选)
* @since [产品/模块版本](可选)
*/
public static boolean judgeJobExist(Scheduler scheduler, String jobGroupName, String jobName)
throws SchedulerException {
JobKey jobKey = new JobKey(jobName, jobGroupName);
// 判断对应的job是否存在
if (scheduler.checkExists(jobKey)) {
logger.info("JobUtil.judgeJobExist:true jobName:{},jobGroupName:{}", jobName, jobGroupName);
return true;
} else {
logger.info("JobUtil.judgeJobExist:false jobName:{},jobGroupName:{}", jobName, jobGroupName);
return false;
}
}
public static boolean judgeTriggerExist(Scheduler scheduler, String triggerName, String triggerGroupName)
throws SchedulerException {
TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroupName);
// 判断对应的job是否存在
if (scheduler.checkExists(triggerKey)) {
logger.info("JobUtil.judgeTriggerExist:true triggerName:{},triggerGroupName:{}", triggerName,
triggerGroupName);
return true;
} else {
logger.info("JobUtil.judgeTriggerExist:false triggerName:{},triggerGroupName:{}", triggerName,
triggerGroupName);
return false;
}
}
public static boolean resumeJob(Scheduler scheduler, String jobGroupName, String jobName)
throws SchedulerException {
JobKey jobKey = new JobKey(jobName, jobGroupName);
// 判断对应的job是否存在
if (scheduler.checkExists(jobKey)) {
/*
* if (!scheduler.isShutdown()) { scheduler.start(); }
*/
scheduler.resumeJob(jobKey);
logger.info("JobUtil.judgeJobExist:true jobName:{},jobGroupName:{}", jobName, jobGroupName);
return true;
} else {
logger.info("JobUtil.judgeJobExist:false jobName:{},jobGroupName:{}", jobName, jobGroupName);
return false;
}
}
}
定时器自动触发方法
import com.alibaba.fastjson.JSON;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.List;
public class InspectionJob implements Job {
private static final Logger logger = LoggerFactory.getLogger(InspectionJob.class);
@Autowired
private InspectionResultService inspectionResultService;
public InspectionJob() {
inspectionResultService = SpringContextUtils.getBeanByClass(InspectionResultService.class);
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
logger.info("InspectionJob.execute context:{}");
try {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
logger.info("start InspectionJob.execute dataMap:{}", JSON.toJSONString(dataMap));
ClusterPatrolDto clusterPatrolDto = new ClusterPatrolDto();
//clusterPatrolDto.setClusterId(clusterId);
//clusterPatrolDto.setClusterName(clusterName);
inspectionResultService.clusterPatrol(clusterPatrolDto);
logger.info("end InspectionJob.execute clusterName:{}", clusterName);
} catch (Exception e) {
logger.info("InspectionJob.execute immediateInspection failed:{}", e);
}
}
}
配置文件 spring-quartz.xml
<bean id="inspectionJob"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass"
value="com.cnsuning.bdes.job.InspectionJob" />
<property name="durability" value="true" />
</bean>
<bean id="quartzScheduler" lazy-init="false"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="applicationContextSchedulerContextKey" value="applicationContextKey"></property>
<property name="configLocation"
value="classpath:conf/spring/spring-quartz.properties"></property>
<property name="autoStartup" value="true" />
<property name="overwriteExistingJobs" value="true" />
</bean>
实时新增定时任务
Map<String, Object> paramsMap = new HashMap<>();
String cronExpression = JobUtil.getCronExpressionByCycle(inspectionSubSetInfo.getSendTime(),inspectionSubSetInfo.getSendFrequency());
if (StringUtils.isBlank(cronExpression)) {
return new ResponseSimpleObject(ResponseSimpleObject.ERROR_CODE, "定时任务新增失败,执行周期为空");
}
paramsMap.put("clusterName", inspectionSubSetInfo.getClusterName());
paramsMap.put("clusterId", inspectionSubSetInfo.getClusterId());
JobUtil.addCronScheduleJob(scheduler, triggerGroupName, triggerName, jobGroupName, jobName,InspectionJob.class, cronExpression, new Date(), paramsMap, 0);
新建表:
执行addCronScheduleJob方法,表qrtz_cron_triggers新增一条定时任务