quartz 任務調度

package cn.thinkjoy.dataInsight.starter;

import cn.thinkjoy.dataInsight.domain.Task;
import cn.thinkjoy.dataInsight.job.TaskJob;
import cn.thinkjoy.dataInsight.service.ITaskExService;
import cn.thinkjoy.dataInsight.service.ITaskService;
import cn.thinkjoy.dataInsight.utils.NetUtil;
import com.alibaba.fastjson.JSONObject;
import javassist.*;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.io.FileOutputStream;
import java.lang.reflect.Modifier;
import java.util.Map;
import java.util.*;

import static org.quartz.JobBuilder.newJob;

/**
 * Created by chanming on 2019/1/9.
 */
@Service("starter")
public class DTaskStarter {

    public static final String dingd_group = "dd";

    private static final Logger logger = LoggerFactory.getLogger(DTaskStarter.class);

    @Autowired
    private ITaskService taskService;

    @Autowired
    private ITaskExService taskExService;

    @Autowired
    private Scheduler scheduler;

    public void init() throws SchedulerException, NoSuchMethodException, ClassNotFoundException {
        Map<String, Object> map = new HashMap<>();
        map.put("status", 0);
        List<Task> taskList=taskService.queryList(map, null, null);
        if (!CollectionUtils.isEmpty(taskList)) {
            for (final Task task : taskList) {
                scheulerTask(task);
            }
            scheduler.start();
        }
    }

    public void scheulerTask(Task task) throws ClassNotFoundException, NoSuchMethodException, SchedulerException {
        CronTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(task.getName(),dingd_group)
                .withSchedule(CronScheduleBuilder.cronSchedule(task.getCron()))
                .build();
        MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
        TaskJob taskJob = new TaskJob();
        taskJob.setTask(task);
        taskJob.setTaskExService(taskExService);
        jobDetail.setTargetObject(taskJob);
        jobDetail.setTargetMethod("execute");
        jobDetail.setName(task.getName());
        jobDetail.setGroup(dingd_group);
        jobDetail.setConcurrent(false);
        jobDetail.afterPropertiesSet();
        scheduler.scheduleJob(jobDetail.getObject(), trigger);
    }

}


 @Scheduled(cron = "0 10/10 * * * ?")
    public void reScheduleTask(){
        Map<String, Object> map = new HashMap<>();
        List<Task> taskList=taskService.queryList(map, "id", "asc");
        List<String> taskNameList = new ArrayList<>();
        if (!org.springframework.util.CollectionUtils.isEmpty(taskList)) {
            for (Task task : taskList) {
                taskNameList.add(task.getName());
                TriggerKey triggerKey = new TriggerKey(task.getName(),"dd");
                JobKey jobKey = new JobKey(task.getName(),"dd");
                try {
                    CronTrigger trigger= (CronTrigger) scheduler.getTrigger(triggerKey);
                    if (trigger == null&&task.getStatus()!=-1) {
                        dTaskStarter.scheulerTask(task);
                        logger.error("新增任務:"+task.getName());
                        continue;
                    }

                    if (trigger == null) {
                        continue;
                    }

                    if (task.getStatus() == -1) {
                        scheduler.pauseTrigger(triggerKey);// 中止觸發器
                        scheduler.unscheduleJob(triggerKey);// 移除觸發器
                        scheduler.deleteJob(jobKey);// 刪除任
                        logger.error("刪除任務:"+task.getName());
                        continue;
                    }

                    String oldExp=trigger.getCronExpression();
                    if (!oldExp.equals(task.getCron())) {//從新調度
                        CronTrigger newtrigger = TriggerBuilder.newTrigger()
                                .withIdentity(task.getName(),"dd")
                                .withSchedule(CronScheduleBuilder.cronSchedule(task.getCron()))
                                .build();
                        scheduler.rescheduleJob(triggerKey, newtrigger);
                        logger.error("從新調度任務:"+task.getName());
                        continue;
                    }
                } catch (SchedulerException e) {
                    logger.error(e.getMessage(),e);
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    logger.error(e.getMessage(),e);
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    logger.error(e.getMessage(),e);
                    e.printStackTrace();
                }
            }
        }



        try {
//                List<String> groupNames = scheduler.getJobGroupNames();
            List<String> groupNames = new ArrayList<>();
            groupNames.add("dd");
            if (!CollectionUtils.isEmpty(groupNames)) {
                for (String groupName : groupNames) {
                    Set<JobKey>jobKeys= scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName));
                    if (!org.springframework.util.CollectionUtils.isEmpty(jobKeys)) {
                        for (JobKey jobKey : jobKeys) {
                            String jobName = jobKey.getName();
                            if (!taskNameList.contains(jobName)) {
                                TriggerKey triggerKey = new TriggerKey(jobName,"dd");
                                scheduler.pauseTrigger(triggerKey);// 中止觸發器
                                scheduler.unscheduleJob(triggerKey);// 移除觸發器
                                scheduler.deleteJob(jobKey);// 刪除任
                                logger.error("刪除任務:"+jobName);
                            }
                        }
                    }
                }
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    } 
	
	
	<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"/>
相關文章
相關標籤/搜索