1. 程式人生 > >spring quartz動態實現對任務的增刪改查(可傳引數)

spring quartz動態實現對任務的增刪改查(可傳引數)

        上一篇文章寫到了關於定時任務的動態實現,在一些情況下,我們可能需要傳引數來實現定時任務,直接貼程式碼了

QuartzParamUtils,核心類

package com.thinkgem.jeesite.modules.task.quartz.param;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;

import com.thinkgem.jeesite.common.utils.SpringContextHolder;
import com.thinkgem.jeesite.modules.img.dao.GrabPictureDao;
import com.thinkgem.jeesite.modules.img.entity.GrabPicture;
import com.thinkgem.jeesite.modules.task.quartz.QuartzJobFactory;
import com.thinkgem.jeesite.modules.task.quartz.uils.QuartzUtils;

public class QuartzParamUtils {
	private static Logger logger = Logger.getLogger(QuartzJobFactory.class);
    
    private static GrabPictureDao grabPictureDao = SpringContextHolder.getBean(GrabPictureDao.class);
 
    /**
     * @Note : 掃面數據庫,檢視是否有計劃任務的變動
     */
    public static void arrageScheduleJob() {
        try {
 
            List<GrabPicture> jobList = grabPictureDao.findList(new GrabPicture());
            if (jobList.size() != 0) {
                for (GrabPicture job : jobList) {
                    // Keys are composed of both a name and group, and the name  must be unique within the group
                    TriggerKey triggerKey = TriggerKey.triggerKey(job.getName(), job.getJobGroup());
                    // 獲取trigger
                    CronTrigger trigger = (CronTrigger) QuartzUtils.scheduler.getTrigger(triggerKey);
                    // 不存在,建立一個
                    if (null == trigger) {
                        createSheduler(QuartzUtils.scheduler, job);
                    } else {// Trigger已存在,那麼更新相應的定時設定
                        updateScheduler(QuartzUtils.scheduler, job, triggerKey, trigger);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 更新相應的定時設定 根據job_status做相應的處理
     * 
     * @param scheduler
     * @param job
     * @param triggerKey
     * @param trigger
     * @throws SchedulerException
     */
    private static void updateScheduler(Scheduler scheduler, GrabPicture job, TriggerKey triggerKey, CronTrigger trigger)
            throws SchedulerException {
        if (job.getStatus().equals("1")) {// 0禁用 1啟用
            if (!trigger.getCronExpression().equalsIgnoreCase(job.getCron())) {
                // 表示式排程構建器
                CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCron());
                // 按新的cronExpression表示式重新構建trigger
                trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
                // 按新的trigger重新設定job執行
                scheduler.rescheduleJob(triggerKey, trigger);
                logger.info(job.getJobGroup() + "." + job.getName() + " 更新完畢,目前cron表示式為:" + job.getCron());
            }
        } else if (job.getStatus().equals("0")) {
            scheduler.pauseTrigger(triggerKey);// 停止觸發器
            scheduler.unscheduleJob(triggerKey);// 移除觸發器
            scheduler.deleteJob(trigger.getJobKey());// 刪除任務
            logger.info(job.getJobGroup() + "." + job.getName() + "刪除完畢");
        }
 
    }
 
    /**
     * 建立一個定時任務,並做安排
     * 
     * @param scheduler
     * @param job
     * @throws SchedulerException
     * @throws Exception
     */
    public static void createSheduler(Scheduler scheduler, GrabPicture job) throws Exception {
        // 在工作狀態可用時,即job_status = 1 ,開始建立
        if (job.getStatus().equals("1")) {
            // 新建一個基於Spring的管理Job類
        	JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
        	jobDetailFactoryBean.setName(job.getName());
        	//jobDetailFactoryBean.setJobClass(job.getClazz().getClass());
        	jobDetailFactoryBean.setJobClass(MyJobClass.class);
        	JobDataMap jobDataMap = new JobDataMap();
        	jobDataMap.put("scheduleJob", job);
        	jobDetailFactoryBean.setJobDataMap(jobDataMap);
        	
        	Map<String,String> jobDataAsMap = new HashMap<>();
            jobDataAsMap.put("targetObject","test");             //作業物件
            jobDataAsMap.put("targetMethod","method");                 //作業方法
            jobDataAsMap.put("arguments","args");                 //作業方法的引數
            jobDetailFactoryBean.setJobDataAsMap(jobDataAsMap); 
        	
        	
        	jobDetailFactoryBean.afterPropertiesSet();

            JobDetail jobDetail = jobDetailFactoryBean.getObject();  //獲取JobDetail物件
            //String cronExpression = createCronExpression(targetTime);//建立cron表示式
            // 表示式排程構建器
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCron());
            // 根據cronExpression表示式構建一個新的trigger
            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(job.getName(),job.getJobGroup())
                    .withSchedule(scheduleBuilder).build();
            // 注入到管理類
            scheduler.scheduleJob(jobDetail, trigger);
        	
        	
        	
          
        }
    }
    
    
    /**
     * 更新相應的定時設定 根據job_status做相應的處理
     * 
     * @param scheduler
     * @param job
     * @param triggerKey
     * @param trigger
     * @throws SchedulerException
     */
    public static void updateScheduler(GrabPicture job)
            throws Exception {
    	Scheduler scheduler = QuartzUtils.scheduler;
    	TriggerKey triggerKey = TriggerKey.triggerKey(job.getName(), job.getJobGroup());
        // 獲取trigger
        CronTrigger trigger = (CronTrigger) QuartzUtils.scheduler.getTrigger(triggerKey);
        // 不存在,建立一個
        if (null == trigger) {
        	createSheduler(scheduler, job);
        	return;
        }
        if (job.getStatus().equals("1")) {// 0禁用 1啟用
            if (!trigger.getCronExpression().equalsIgnoreCase(job.getCron())) {
                // 表示式排程構建器
                CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCron());
                // 按新的cronExpression表示式重新構建trigger
                trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
                // 按新的trigger重新設定job執行
                scheduler.rescheduleJob(triggerKey, trigger);
                logger.info(job.getJobGroup() + "." + job.getName() + " 更新完畢,目前cron表示式為:" + job.getCron());
            }
        } else if (job.getStatus().equals("0")) {
            scheduler.pauseTrigger(triggerKey);// 停止觸發器
            scheduler.unscheduleJob(triggerKey);// 移除觸發器
            scheduler.deleteJob(trigger.getJobKey());// 刪除任務
            logger.info(job.getJobGroup() + "." + job.getName() + "刪除完畢");
        }
 
    }
    
    
    /**
     * 更新相應的定時設定 根據job_status做相應的處理
     * 
     * @param scheduler
     * @param job
     * @param triggerKey
     * @param trigger
     * @throws SchedulerException
     */
    public static void deleteScheduler(GrabPicture job)
            throws Exception {
    	Scheduler scheduler = QuartzUtils.scheduler;
    	TriggerKey triggerKey = TriggerKey.triggerKey(job.getName(), job.getJobGroup());
        // 獲取trigger
        CronTrigger trigger = (CronTrigger) QuartzUtils.scheduler.getTrigger(triggerKey);
        // 不存在,建立一個
        if (null == trigger) {
        	return;
        }
        scheduler.pauseTrigger(triggerKey);// 停止觸發器
        scheduler.unscheduleJob(triggerKey);// 移除觸發器
        scheduler.deleteJob(trigger.getJobKey());// 刪除任務
        logger.info(job.getJobGroup() + "." + job.getName() + "刪除完畢");
    }
}

執行定時任務的類MyJobClass

package com.thinkgem.jeesite.modules.task.quartz.param;

import java.lang.reflect.Method;

import org.apache.log4j.Logger;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.QuartzJobBean;

import com.thinkgem.jeesite.modules.img.entity.GrabPicture;

/**
 * 帶參的JobClass
 * Created by xiaoming on 2017/5/4.
 */
public class MyJobClass extends QuartzJobBean {
	private static Logger logger = Logger.getLogger(MyJobClass.class);
	
    private String targetObject;   //執行job的物件
    private String targetMethod;   //執行job的方法
    private Object arguments;      //執行job的方法引數(如果方法不帶參可以刪除此引數)
    private ApplicationContext ctx;//ApplicationContext

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {

        try {
        	JobDataMap jobDataMap = context.getMergedJobDataMap();
        	GrabPicture scheduleJob = (GrabPicture)jobDataMap.get("scheduleJob");
        	System.out.println(scheduleJob.getCron());
        	System.out.println(context.getMergedJobDataMap());
        	
        	System.out.println("測試");
        	
        	System.out.println("targetObject:" + targetObject);
        	System.out.println("targetMethod:" + targetMethod);
        	System.out.println("arguments:" + arguments);
        	
        	
        	
           
        } catch (Exception e) {
            logger.error(e);
        }
    }
    //以下是注入方法
    public void setApplicationContext(ApplicationContext applicationContext) {
        this.ctx = applicationContext;
    }

    public void setTargetObject(String targetObject) {
        this.targetObject = targetObject;
    }

    public void setTargetMethod(String targetMethod) {
        this.targetMethod = targetMethod;
    }

    public void setArguments(Object arguments) {
        this.arguments = arguments;
    }
}