Spring + Quartz

5 篇文章 0 订阅

package com.lec.util.job;

import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;

import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;

import com.lec.assurance.client.dto.ResTypeDTO;
import com.lec.assurance.utils.StringHandler;

/**
 * CronTrigger任务调度器
 * @author lcy
 *	Dec 1, 2011
 */
public class CronTriggerRunner {
	private static SchedulerFactory sf = new StdSchedulerFactory();
	
	
	
	/**
	 * 根据任务名和任务组名查询一个任务
	 * @param jobName
	 * @param jobGroupName
	 * @return
	 * @throws SchedulerException
	 */
	public static JobDetail getJob(String jobName,String jobGroupName) throws SchedulerException{
		Scheduler sched = sf.getScheduler();
		JobDetail jobDetail=sched.getJobDetail(jobName, jobGroupName);
		if(jobDetail != null){
			return jobDetail;
		}
		return null;
	}
	   
	/**
	* 添加一个CronTrigger定时任务
	* @param jobName 任务名
	* @param jobGroupName 任务组名
	* @param triggerName 触发器名
	* @param triggerGroupName 触发器组名
	* @param job     任务
	* @param time    时间设置,参考quartz说明文档
	* @param params 传递参数
	* @throws SchedulerException
	* @throws ParseException 
	*/
	public static void addJob(String jobName,String jobGroupName,String triggerName,
			String triggerGroupName,String time,HashMap<String,?> params,
			Job jobClass) throws SchedulerException, ParseException{
	   Scheduler sched = sf.getScheduler();
	   JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass.getClass());//任务名,任务组,任务执行类
	   if(params != null){
			  jobDetail.getJobDataMap().put("params",params);
		  }
	   //触发器
	   CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);//触发器名,触发器组
	   trigger.setCronExpression(time);//触发器时间设定
	   sched.scheduleJob(jobDetail,trigger);
	   if(!sched.isShutdown())
	       sched.start();
	}
	
	/**
	 * 添加一个SimpleTrigger定时任务
	 * @param jobName 任务名
	 * @param jobGroupName 任务组名
	 * @param triggerName 触发器名
	 * @param triggerGroupName 触发器组名
	 * @param startTime 开始时间
	 * @param repeatInterval 间隔时间
	 * @param repeatCount 调用次数
	 * @param jobClass 任务
	 * @param params 传递参数
	 * @throws SchedulerException
	 */
	public static void addJob(String  jobName,String  jobGroup,
			String  triggerName,String  triggerGroup,Date startTime,
			Integer repeatInterval,Integer repeatCount,Job jobClass,
			HashMap<String,Object> params) throws 
			SchedulerException{
		JobDetail jobDetail = new JobDetail(jobName, jobGroup, jobClass.getClass());
		if(params != null){
			 jobDetail.getJobDataMap().put("params",params);
		 }
		//触发器
		SimpleTrigger simpleTrigger = new SimpleTrigger(triggerName, triggerGroup);
        //设置开始时间
		simpleTrigger.setStartTime(startTime);
		//设置间隔时间
        simpleTrigger.setRepeatInterval(repeatInterval);
        //设置调用次数
        simpleTrigger.setRepeatCount(repeatCount);
        
        Scheduler sched = sf.getScheduler();
        sched.scheduleJob(jobDetail,simpleTrigger);
 	    if(!sched.isShutdown())
 	       sched.start();
	}
	   
	/** 
	* 根据任务名和任务组名修改任务的触发时间
	* @param jobName 任务名
	* @param jobGroupName 任务组名
	* @param time
	* @throws SchedulerException
	* @throws ParseException
	*/
	public static void modifyJobTime(String jobName,String jobGroupName,String time) 
			throws SchedulerException, ParseException{
	    Scheduler sched = sf.getScheduler();
	    Trigger[] trigger = sched.getTriggersOfJob(jobName,jobGroupName);
	    if(trigger != null){
	    	for(int i=0;i<trigger.length;i++){
		        ((CronTrigger)trigger[i]).setCronExpression(time);
		        sched.resumeTrigger(trigger[i].getName(),trigger[i].getGroup());
	    	}
	    }
	}
	   
	/**
	* 根据触发器名修改一个任务的触发时间
	* @param triggerName触发器名
	* @param triggerGroupName触发器组名
	* @param time
	* @throws SchedulerException
	* @throws ParseException
	*/
	public static void modifyTriggerTime(String triggerName,String triggerGroupName,
	             String time)  throws SchedulerException, ParseException{
	    Scheduler sched = sf.getScheduler();
	    Trigger trigger = sched.getTrigger(triggerName,triggerGroupName);
	    if(trigger != null){
	        //修改时间
	        ((CronTrigger)trigger).setCronExpression(time);
	       //重启触发器
	       sched.resumeTrigger(triggerName,triggerGroupName);
	   }
	}
	
	/**
	* 移除任务
	* @param jobName任务名
	* @param jobGroupName任务组名
	* @param triggerGroupName触发器组名
	* @throws SchedulerException
	*/
	public static void removeJob(String jobName,String jobGroupName,String triggerGroupName) 
			throws SchedulerException{
	  Scheduler sched = sf.getScheduler();
	  String[] triggerNames = sched.getTriggerNames(triggerGroupName);
	  if(triggerNames!=null){
		  for(int i=0;i<triggerNames.length;i++){
			  sched.pauseTrigger(triggerNames[i],triggerGroupName);//停止触发器
			  sched.unscheduleJob(triggerNames[i],triggerGroupName);//移除触发器 
		  }
	  }
	  sched.deleteJob(jobName,jobGroupName);//删除任务
	}
	   
	/**
	* 移除一个任务
	* @param jobName任务名
	* @param jobGroupName任务组名
	* @param triggerName触发器名
	* @param triggerGroupName触发器组名
	* @throws SchedulerException
	*/
	public static void removeJob(String jobName,String jobGroupName,
			String triggerName,String triggerGroupName) 
			throws SchedulerException{
	  Scheduler sched = sf.getScheduler();
	  sched.pauseTrigger(triggerName,triggerGroupName);//停止触发器
	  sched.unscheduleJob(triggerName,triggerGroupName);//移除触发器
	  sched.deleteJob(jobName,jobGroupName);//删除任务
	}
	
	/**
	 * 计算时间表达式
	 * @param second        秒
	 * @param minute        分
	 * @param hour   		时
	 * @param day			日期
	 * @param month			月份
	 * @param week			星期
	 * @param year			年份
	 * @param isContactYear 是否包括年份
	 * @return
	 */
	public static String getCexpress(String second,String minute,String hour,
			String day,String month,String week,String year,boolean isContactYear) {
		String cexpress="";
		//秒,默认为"0" 取值范围:0-59
		if(second != null && !"".equals(second)){
			cexpress+=second+" ";
		}else{
			cexpress+="0 ";
		}
		
		/**
		 * 分 取值范围:0-59
		 * 默认为"*"      表示每一分钟
		 * 如果是0 12     表示整12:00触发
		 * 如果是0/5 12   表示在每天下午12点到12:55期间的每5分钟触发 ,
		 * 如果是0-5 12   表示12:00到12:05期间的每1分钟触发
		 * 如果是10,15 12 表示12:10和12:15触发
		 */
		if(minute != null && !"".equals(minute)){
			cexpress+=minute+" ";
		}else{
			cexpress+="* ";
		}
		
		/**
		 * 小时 取值范围:0-23
		 * 默认为"*"      表示每一个小时
		 * 如果是0        表示凌晨触发
		 * 如果是0-5		 表示凌晨到5:00期间
		 * 如果是10,15    表示10:00和15:00触发
		 */
		if(hour != null && !"".equals(hour)){
			cexpress+=hour+" ";
		}else{
			cexpress+="* ";
		}
		
		/**
		 * 日期 取值范围:1-31
		 * 默认为"*" 表示每天
		 * 如果是15  表示每个月的15号
		 * 如果是L   表示每个月最后一天 
		 * 注:在指定了星期的时候,把日期这里设置为"?"
		 */
		if(day != null && !"".equals(day)){
			cexpress+=day+" ";
		}else{
			cexpress+="* ";
		}
		
		/**
		 * 月份 取值范围:1-12
		 * 默认为"*"  表示每个月
		 * 如果是 12  表示12月份
		 */
		if(month != null && !"".equals(month)){
			cexpress+=month+" ";
		}else{
			cexpress+="* ";
		}
		
		/**
		 * 星期  取值范围:1-7 MON,TUE,WED,THU,FRI,SAT,SUN  其中1表示星期日,以此类推
		 * 默认为"?"
		 * 如果是WED      表示每个星期三
		 * 如果是MON-FRI  表示星期一到星期五
		 * 如果是6L       表示每月最后一个星期五
		 * 如果是6#3      表示每月第三个星期五
		 */
		if(week != null && !"".equals(week)){
			cexpress+=week+" ";
		}else{
			cexpress+="? ";
		}
		
		//如果包括年份
		if(isContactYear){
			/**
			 * 年份  取值范围:1970-2099
			 * 默认值为空
			 * 如果是2010 表示只有2010年触发时间
			 * 如果是2010,2020 表示只有2010
			 */
			if(year != null && !"".equals(year)){
				cexpress+=year;	
			}
		}
		
		return cexpress;
	}

	public static void main(String [] args){
	try {
		String hour = "13";
		String timeexp = CronTriggerRunner.getCexpress("0", "0/1", hour, null, null, null, null, false);
		System.out.println("express="+timeexp);
		JobDetail job=null; 
		try {
			job=CronTriggerRunner.getJob(ResTypeDTO.LATEPROJLOG_JOBNAME, ResTypeDTO.LATEPROJLOG_JOBGROUPNAME);
			if(job != null){//如果任务已经存在 则删除任务
				CronTriggerRunner.removeJob(ResTypeDTO.LATEPROJLOG_JOBNAME,
						ResTypeDTO.LATEPROJLOG_JOBGROUPNAME,
						ResTypeDTO.LATEPROJLOG_TRIGGERNAME,
						ResTypeDTO.LATEPROJLOG_TRIGGERGROUPNAME);
			}
			System.out.println("---------Lateprojlog job  创建一个新任务------------------------");
			System.out.println("jobName:   "+ResTypeDTO.LATEPROJLOG_JOBNAME);
			System.out.println(StringHandler.dateFormatToStr("当前时间:"+StringHandler.DATETIMESENCOND_TYPE_FORMATER, new Date())+" , timeexp:   "+timeexp);
			System.out.println("---------Lateprojlog job  创建一个新任务end---------------------");
			//添加一个任务
			CronTriggerRunner.addJob(ResTypeDTO.LATEPROJLOG_JOBNAME,
					ResTypeDTO.LATEPROJLOG_JOBGROUPNAME,
					ResTypeDTO.LATEPROJLOG_TRIGGERNAME,
					ResTypeDTO.LATEPROJLOG_TRIGGERGROUPNAME, 
					timeexp, null,new LateprojlogJob());
		} catch (SchedulerException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		}
		//-------------------//
		JobDetail jobDetail = new JobDetail(ResTypeDTO.PSMSCFG_JOBNAME, 
				ResTypeDTO.PSMSCFG_JOBGROUPNAME,PsmsCleanJob.class);
        // ①-1:创建CronTrigger,指定组及名称
        CronTrigger cronTrigger = new CronTrigger(ResTypeDTO.PSMSCFG_TRIGGERNAME,
				ResTypeDTO.PSMSCFG_TRIGGERGROUPNAME);
        // ①-2:定义Cron表达式
        String timeexp = "";
		String second = "0";
		String minute = "15";
		String hour = "0";
		String day = "L";//当月的最后一天
		String month = "";
		String week = "?";
		month = "6,12";
		timeexp = getCexpress(second, minute, hour, day, month, week, null, false);
		
        if(!"0 * * * * ?".equals(timeexp)){//如果没有设置时间则不执行
	        CronExpression cexp = new CronExpression(timeexp);
	        // ①-3:设置Cron表达式
	        cronTrigger.setCronExpression(cexp);
	        Scheduler scheduler = sf.getScheduler();
	        scheduler.scheduleJob(jobDetail, cronTrigger);
	        scheduler.start();
        }
			Date startDate = entity.getStartDate();
			String startTime =  entity.getStarttime();
			Integer delaytime = entity.getDelaytime();
			String unit = entity.getUnit();
//			String jobName = "cal_job_name_";
//			String jobGroupName = "cal_job_group_name";
//			String triggerName = "cal_trigger_name_";
//			String triggerGroupName = "cal_trigger_group_name";
//			Date beginTime = new Date(System.currentTimeMillis() + 60000L);//当前时间过60秒钟后开始
//			Integer repeatInterval = 5000;//以毫秒为单位
//			Integer repeatCount = 0;
//			try {
//				CronTriggerRunner.addJob(jobName,jobGroupName,triggerName,
//						triggerGroupName,beginTime,repeatInterval,
//						repeatCount,new CalendarJob(),new HashMap<String,Object>());
//			} catch (SchedulerException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
		
       } catch (Exception e) {
           e.printStackTrace();
       }
	}
	
	
}




CalendarJob.java

package com.lec.util.job;
import java.util.Date;
import java.util.HashMap;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.lec.assurance.service.OaCalendarManager;
import com.lec.assurance.utils.ContextUtils;
import com.lec.assurance.utils.StringHandler;

public class CalendarJob implements Job {
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
           JobDataMap map = context.getMergedJobDataMap();
           Object obj = map.get("params");
           if(StringHandler.isValidObj(obj)){
               HashMap<String,Object> params = (HashMap<String,Object>)obj;
               Object objid = params.get("id");
               if(StringHandler.isValidObj(objid)){
                   String idstr = objid.toString();
                   OaCalendarManager mgr = (OaCalendarManager)ContextUtils.getBean(OaCalendarManager.class);
                   mgr.sendRemind(Long.parseLong(idstr));}}}}
 

停止一个正在执行的Job

/**
	 * 停止一个任务
	 * @param jobName
	 * @param jobGroupName
	 * @throws SchedulerException
	 */
	public static void stopJob(String jobName,String jobGroupName) throws SchedulerException {
		  Scheduler sched = sf.getScheduler();
		  sched.interrupt(jobName, jobGroupName);
	}
需要注意的是:这里停止的job必须是实现InterruptableJob的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值