java 动态新增定时任务

工具类

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新增一条定时任务

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值