spring整合quartz,实现自助动态管理自动任务

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzl19870309/article/details/65628349

之前在我们的项目中引入了quartz框架,来实现分布式自动任务处理。之后提出的需求是:希望能够在管理系统中可以 查看所有任务、暂停/启用自动任务、动态新增/删除、立即执行、修改cron表达式等

最后经过查看官网文档和网上各位网友的资料,终于顺利完成了该需求,下边与大家分享一下:

一、查看自动任务列表

public List<QuartzTrigger> queryTriggerList() {
    try {
            GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
            Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
            List<QuartzTrigger> jobList = new ArrayList<QuartzTrigger>();
            for (JobKey jobKey : jobKeys) {
                List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
                for (Trigger trigger : triggers) {
                    QuartzTrigger job = new QuartzTrigger();
                    job.setSchedulerName(scheduler.getSchedulerName());
                    job.setJobName(jobKey.getName());
                    job.setJobGroup(jobKey.getGroup());
                    job.setTriggerName(trigger.getKey().getName());
                    job.setTriggerGroup(trigger.getKey().getGroup());
                    job.setNextFireTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(trigger.getNextFireTime()));
                    Date previousFireTime = trigger.getPreviousFireTime();
                    if(previousFireTime != null) {
                        job.setPrevFireTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(previousFireTime));
                    }
                    Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
                    job.setStatus(triggerState.name());
                    if (trigger instanceof CronTrigger) {
                        CronTrigger cronTrigger = (CronTrigger) trigger;
                        String cronExpression = cronTrigger.getCronExpression();
                        job.setCron(cronExpression);
                    }
                    jobList.add(job);
                }
            }
            return jobList;
        }catch (SchedulerException e) {
            logger.error("获取自动任务列表失败",e);
            throw new SeaException("QRT006","获取自动任务列表失败");
        }
    }

二、暂停指定任务

public void pauseTrigger(String triggerName,String triggerGroupName) {
    try {
            logger.debug("暂停任务触发器:" + triggerName);
            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,triggerGroupName);
            scheduler.pauseTrigger(triggerKey);
        } catch (SchedulerException e) {
            logger.error("暂停任务触发器失败:" + triggerName,e);
            throw new SeaException("QRT006","暂停任务触发器失败:" + triggerName);
        }
    }

三、重新启用某自动任务

public void resumeTrigger(String triggerName ,String triggerGroup ) {
    try {
            logger.debug("启用任务触发器:" + triggerName);
            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,triggerGroup);
            scheduler.resumeTrigger(triggerKey);
        } catch (SchedulerException e) {
            logger.error("启用任务触发器失败:" + triggerName,e);
            throw new SeaException("QRT005","启用任务触发器失败:" + triggerName);
        }
    }

四、删除制定任务

public void delTrigger(String triggerName,String triggerGroup,String jobName,String jobGroup) {
    try {
            logger.debug("移除任务触发器:" + triggerName);
            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,triggerGroup);
            scheduler.pauseTrigger(triggerKey); //暂停触发器
            scheduler.unscheduleJob(triggerKey); //移除触发器
            JobKey jobKey = JobKey.jobKey(jobName,jobGroup);
            scheduler.deleteJob(jobKey);
        } catch (SchedulerException e) {
            logger.error("移除任务触发器失败:" + triggerName,e);
            throw new SeaException("QRT004","移除任务触发器失败:" + triggerName);
        }
    }

五、立即执行任务

public void runjob(String jobName,String jobGroup) {
        try {
            logger.debug("立即执行任务:" + jobName);
            JobKey jobKey = JobKey.jobKey(jobName,jobGroup);
            scheduler.triggerJob(jobKey);
        } catch (SchedulerException e) {
            logger.error("立即执行任务失败:" + jobName,e);
            throw new SeaException("QRT002","立即执行任务失" + jobName);
        }
    }

六、新增任务

public void addjob(String jobName,String jobGroupName,String cron) {
        logger.debug("添加自动任务:" + jobName);
        Job job = (Job)exContextUtils.getBean(jobName);
        try {
             JobDetail jobDetail = null;
             if(StringUtils.isEmpty(jobGroupName)) {
                 jobGroupName =  QuartzConstants.JOB_GROUP_NAME;
             }
             jobDetail = JobBuilder.newJob(job.getClass()).withIdentity(jobName, jobGroupName).build();// 任务名,任务组,任务执行类
             // 触发器
             CronScheduleBuilder  cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
             Trigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName).withSchedule(cronScheduleBuilder).build();
             scheduler.scheduleJob(jobDetail, trigger);
            // 启动
            if (scheduler.isShutdown()) {
                scheduler.start();
            }
        } catch (Exception e) {
            logger.error("添加自动任务失败:" + jobName,e);
            throw new SeaException("QRT001","添加自动任务失败");
        }
    }

七、修改cron表达式

 public void updateJobCron(String triggerName,String triggerGroupName,String cron) {
        try{
            if(StringUtils.isEmpty(triggerGroupName)) {
                triggerGroupName =  QuartzConstants.TRIGGER_GROUP_NAME;
            }
            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
            if(triggerKey!=null){
                TriggerBuilder<CronTrigger> triggerBuilder = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder);
                trigger = triggerBuilder.build();
            }
            scheduler.rescheduleJob(triggerKey, trigger);
            ((CronTriggerImpl)trigger).setStartTime(new Date());
        }catch (Exception e) {
            logger.error("自动任务cron表达式修改失败",e);
            throw new SeaException("QRT007","添加自动任务失败");
        }
    }

QuartzTrigger的实现

public class QuartzTrigger {

    private String schedulerName;

    private String triggerName;

    private String triggerGroup;

    private String jobName;

    private String jobGroup;

    private String nextFireTime;

    private String prevFireTime;

    private String status;

    private String cron;

    public String getSchedulerName() {
        return schedulerName;
    }

    public void setSchedulerName(String schedulerName) {
        this.schedulerName = schedulerName;
    }

    public String getTriggerName() {
        return triggerName;
    }

    public void setTriggerName(String triggerName) {
        this.triggerName = triggerName;
    }

    public String getTriggerGroup() {
        return triggerGroup;
    }

    public void setTriggerGroup(String triggerGroup) {
        this.triggerGroup = triggerGroup;
    }

    public String getJobName() {
        return jobName;
    }

    public void setJobName(String jobName) {
        this.jobName = jobName;
    }

    public String getJobGroup() {
        return jobGroup;
    }

    public void setJobGroup(String jobGroup) {
        this.jobGroup = jobGroup;
    }

    public String getNextFireTime() {
        return nextFireTime;
    }

    public void setNextFireTime(String nextFireTime) {
        this.nextFireTime = nextFireTime;
    }

    public String getPrevFireTime() {
        return prevFireTime;
    }

    public void setPrevFireTime(String prevFireTime) {
        this.prevFireTime = prevFireTime;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getCron() {
        return cron;
    }

    public void setCron(String cron) {
        this.cron = cron;
    }
}

以上是我们项目中的实现方式,很多参考了网上的自量,可能和网上有雷同,还行各位同仁勿喷。

猜你喜欢

转载自blog.csdn.net/wzl19870309/article/details/65628349
今日推荐