JobManagerServiceImpl.java 5.01 KB
Newer Older
谢恒's avatar
谢恒 committed
1 2 3 4 5 6
package com.hs.admin.service.impl;

import com.hs.admin.bean.SysTask;
import com.hs.admin.service.JobManagerService;
import com.hs.admin.util.JsonUtils;
import org.quartz.*;
谢恒's avatar
谢恒 committed
7
import org.quartz.utils.Key;
谢恒's avatar
谢恒 committed
8
import org.springframework.stereotype.Service;
谢恒's avatar
谢恒 committed
9
import org.springframework.util.ObjectUtils;
谢恒's avatar
谢恒 committed
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

import javax.annotation.Resource;
import java.net.URL;

/**
 * @author xieheng
 */
@Service
public class JobManagerServiceImpl implements JobManagerService {
    @Resource
    Scheduler scheduler;

    /**
     * 添加任务
     *
     * @return
     */
    @SuppressWarnings("unchecked")
    @Override
    public boolean addJob(SysTask task) {
        try {
谢恒's avatar
谢恒 committed
31 32 33 34
            deleteJob(task);
            String key = String.valueOf(task.getJcbId());
            String value = String.valueOf(task.getCid());

谢恒's avatar
谢恒 committed
35 36 37 38
            // 创建jobDetail实例,绑定Job实现类
            // 指明job的名称,所在组的名称,以及绑定job类
            Class<? extends Job> jobClass = (Class<? extends Job>) (Class.forName(task.getBeanClass()).newInstance().getClass());
            // 任务名称和组构成任务key
谢恒's avatar
谢恒 committed
39
            JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(key, value).build();
谢恒's avatar
谢恒 committed
40 41 42
            // 定义调度触发规则
            // 使用cornTrigger规则
            // 触发器key
谢恒's avatar
谢恒 committed
43 44 45 46 47 48
            TriggerBuilder builder = TriggerBuilder.newTrigger().withIdentity(key, value)
                    .startAt(DateBuilder.futureDate(1, DateBuilder.IntervalUnit.SECOND));
            if (!ObjectUtils.isEmpty(task.getCronExpression())) {
                builder.withSchedule(CronScheduleBuilder.cronSchedule(task.getCronExpression()));
            }
            Trigger trigger = builder.startNow().build();
谢恒's avatar
谢恒 committed
49 50
            trigger.getJobDataMap().put("triggerTask", JsonUtils.beanToJson(task));
            // 把作业和触发器注册到任务调度中
谢恒's avatar
谢恒 committed
51 52 53
            scheduler.scheduleJob(jobDetail, trigger);
            scheduler.start();
            return true;
谢恒's avatar
谢恒 committed
54 55 56 57 58 59 60 61 62 63 64 65 66 67
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * @description: 暂停任务
     * @return: void
     * @author: XieHeng
     * @date: 2021/4/27 5:35 下午
     */
    @Override
    public boolean pauseJob(SysTask task) {
谢恒's avatar
谢恒 committed
68
        JobKey jobKey = JobKey.jobKey(String.valueOf(task.getJcbId()), String.valueOf(task.getCid()));
谢恒's avatar
谢恒 committed
69
        try {
谢恒's avatar
谢恒 committed
70 71 72 73
            boolean b = scheduler.checkExists(jobKey);
            if (b) {
                scheduler.deleteJob(jobKey);
            }
谢恒's avatar
谢恒 committed
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
            return true;
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * @description: 恢复任务
     * @return: void
     * @author: XieHeng
     * @date: 2021/4/27 5:35 下午
     */
    @Override
    public boolean resumeJob(SysTask task) {
谢恒's avatar
谢恒 committed
89
        JobKey jobKey = JobKey.jobKey(String.valueOf(task.getJcbId()), String.valueOf(task.getCid()));
谢恒's avatar
谢恒 committed
90
        try {
谢恒's avatar
谢恒 committed
91 92 93 94 95 96
            boolean b = scheduler.checkExists(jobKey);
            if (b) {
                scheduler.resumeJob(jobKey);
            } else {
                addJob(task);
            }
谢恒's avatar
谢恒 committed
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
            return true;
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * @description: 删除任务
     * @return: void
     * @author: XieHeng
     * @date: 2021/4/27 5:35 下午
     */
    @Override
    public boolean deleteJob(SysTask task) {
        try {
谢恒's avatar
谢恒 committed
113
            JobKey jobKey = JobKey.jobKey(String.valueOf(task.getJcbId()), String.valueOf(task.getCid()));
谢恒's avatar
谢恒 committed
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
            scheduler.deleteJob(jobKey);
            return true;
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

        return false;
    }

    /**
     * @description: 立马执行任务
     * @return: void
     * @author: XieHeng
     * @date: 2021/4/27 5:35 下午
     */
    @Override
    public boolean runJobNow(SysTask task) {
谢恒's avatar
谢恒 committed
131
        JobKey jobKey = JobKey.jobKey(String.valueOf(task.getJcbId()), String.valueOf(task.getCid()));
谢恒's avatar
谢恒 committed
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
        try {
            scheduler.triggerJob(jobKey);
            return true;
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * @description: 更新cron表达式
     * @return: void
     * @author: XieHeng
     * @date: 2021/4/27 5:36 下午
     */
    @Override
    public boolean updateJobCron(SysTask task) {
谢恒's avatar
谢恒 committed
149
        TriggerKey triggerKey = TriggerKey.triggerKey(String.valueOf(task.getJcbId()), String.valueOf(task.getCid()));
谢恒's avatar
谢恒 committed
150 151 152 153 154 155 156 157 158 159 160 161 162
        try {
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(task.getCronExpression());
            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();
            scheduler.rescheduleJob(triggerKey, trigger);
            return true;
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        return false;
    }

}