• 任务调度开源框架Quartz动态加入、改动和删除定时任务


            Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包括了调度器监听、作业和触发器监听。你能够配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听。Quartz 同意开发者依据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz 的应用程序能够重用来自不同事件的作业,还能够为一个事件组合多个作业。而且还能和Spring配置整合使用。Quartz在功能上远远超越了JDK自带的Timer,非常好非常强大!好啦,直接上代码:

    /**
     * @Description: 
     *
     * @Title: QuartzManager.java
     * @Package com.joyce.quartz
     * @Copyright: Copyright (c) 2014
     *
     * @author Comsys-LZP
     * @date 2014-6-26 下午03:15:52
     * @version V2.0
     */
    package com.joyce.quartz;
    
    import org.quartz.CronTrigger;
    import org.quartz.JobDetail;
    import org.quartz.Scheduler;
    import org.quartz.SchedulerFactory;
    import org.quartz.impl.StdSchedulerFactory;
    
    /**
     * @Description: 定时任务管理类
     * 
     * @ClassName: QuartzManager
     * @Copyright: Copyright (c) 2014
     * 
     * @author Comsys-LZP
     * @date 2014-6-26 下午03:15:52
     * @version V2.0
     */
    public class QuartzManager {
    	private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
    	private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";
    	private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";
    
    	/**
    	 * @Description: 加入一个定时任务,使用默认的任务组名,触发器名,触发器组名
    	 * 
    	 * @param jobName
    	 *            任务名
    	 * @param cls
    	 *            任务
    	 * @param time
    	 *            时间设置,參考quartz说明文档
    	 * 
    	 * @Title: QuartzManager.java
    	 * @Copyright: Copyright (c) 2014
    	 * 
    	 * @author Comsys-LZP
    	 * @date 2014-6-26 下午03:47:44
    	 * @version V2.0
    	 */
    	@SuppressWarnings("unchecked")
    	public static void addJob(String jobName, Class cls, String time) {
    		try {
    			Scheduler sched = gSchedulerFactory.getScheduler();
    			JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任务名,任务组,任务运行类
    			// 触发器
    			CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组
    			trigger.setCronExpression(time);// 触发器时间设定
    			sched.scheduleJob(jobDetail, trigger);
    			// 启动
    			if (!sched.isShutdown()) {
    				sched.start();
    			}
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    	/**
    	 * @Description: 加入一个定时任务
    	 * 
    	 * @param jobName
    	 *            任务名
    	 * @param jobGroupName
    	 *            任务组名
    	 * @param triggerName
    	 *            触发器名
    	 * @param triggerGroupName
    	 *            触发器组名
    	 * @param jobClass
    	 *            任务
    	 * @param time
    	 *            时间设置,參考quartz说明文档
    	 * 
    	 * @Title: QuartzManager.java
    	 * @Copyright: Copyright (c) 2014
    	 * 
    	 * @author Comsys-LZP
    	 * @date 2014-6-26 下午03:48:15
    	 * @version V2.0
    	 */
    	@SuppressWarnings("unchecked")
    	public static void addJob(String jobName, String jobGroupName,
    			String triggerName, String triggerGroupName, Class jobClass,
    			String time) {
    		try {
    			Scheduler sched = gSchedulerFactory.getScheduler();
    			JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任务名,任务组,任务运行类
    			// 触发器
    			CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 触发器名,触发器组
    			trigger.setCronExpression(time);// 触发器时间设定
    			sched.scheduleJob(jobDetail, trigger);
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    	/**
    	 * @Description: 改动一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
    	 * 
    	 * @param jobName
    	 * @param time
    	 * 
    	 * @Title: QuartzManager.java
    	 * @Copyright: Copyright (c) 2014
    	 * 
    	 * @author Comsys-LZP
    	 * @date 2014-6-26 下午03:49:21
    	 * @version V2.0
    	 */
    	@SuppressWarnings("unchecked")
    	public static void modifyJobTime(String jobName, String time) {
    		try {
    			Scheduler sched = gSchedulerFactory.getScheduler();
    			CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName,TRIGGER_GROUP_NAME);
    			if (trigger == null) {
    				return;
    			}
    			String oldTime = trigger.getCronExpression();
    			if (!oldTime.equalsIgnoreCase(time)) {
    				JobDetail jobDetail = sched.getJobDetail(jobName,JOB_GROUP_NAME);
    				Class objJobClass = jobDetail.getJobClass();
    				removeJob(jobName);
    				addJob(jobName, objJobClass, time);
    			}
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    	/**
    	 * @Description: 改动一个任务的触发时间
    	 * 
    	 * @param triggerName
    	 * @param triggerGroupName
    	 * @param time
    	 * 
    	 * @Title: QuartzManager.java
    	 * @Copyright: Copyright (c) 2014
    	 * 
    	 * @author Comsys-LZP
    	 * @date 2014-6-26 下午03:49:37
    	 * @version V2.0
    	 */
    	public static void modifyJobTime(String triggerName,
    			String triggerGroupName, String time) {
    		try {
    			Scheduler sched = gSchedulerFactory.getScheduler();
    			CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName,triggerGroupName);
    			if (trigger == null) {
    				return;
    			}
    			String oldTime = trigger.getCronExpression();
    			if (!oldTime.equalsIgnoreCase(time)) {
    				CronTrigger ct = (CronTrigger) trigger;
    				// 改动时间
    				ct.setCronExpression(time);
    				// 重新启动触发器
    				sched.resumeTrigger(triggerName, triggerGroupName);
    			}
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    	/**
    	 * @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
    	 * 
    	 * @param jobName
    	 * 
    	 * @Title: QuartzManager.java
    	 * @Copyright: Copyright (c) 2014
    	 * 
    	 * @author Comsys-LZP
    	 * @date 2014-6-26 下午03:49:51
    	 * @version V2.0
    	 */
    	public static void removeJob(String jobName) {
    		try {
    			Scheduler sched = gSchedulerFactory.getScheduler();
    			sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止触发器
    			sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除触发器
    			sched.deleteJob(jobName, JOB_GROUP_NAME);// 删除任务
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    	/**
    	 * @Description: 移除一个任务
    	 * 
    	 * @param jobName
    	 * @param jobGroupName
    	 * @param triggerName
    	 * @param triggerGroupName
    	 * 
    	 * @Title: QuartzManager.java
    	 * @Copyright: Copyright (c) 2014
    	 * 
    	 * @author Comsys-LZP
    	 * @date 2014-6-26 下午03:50:01
    	 * @version V2.0
    	 */
    	public static void removeJob(String jobName, String jobGroupName,
    			String triggerName, String triggerGroupName) {
    		try {
    			Scheduler sched = gSchedulerFactory.getScheduler();
    			sched.pauseTrigger(triggerName, triggerGroupName);// 停止触发器
    			sched.unscheduleJob(triggerName, triggerGroupName);// 移除触发器
    			sched.deleteJob(jobName, jobGroupName);// 删除任务
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    	/**
    	 * @Description:启动全部定时任务
    	 * 
    	 * 
    	 * @Title: QuartzManager.java
    	 * @Copyright: Copyright (c) 2014
    	 * 
    	 * @author Comsys-LZP
    	 * @date 2014-6-26 下午03:50:18
    	 * @version V2.0
    	 */
    	public static void startJobs() {
    		try {
    			Scheduler sched = gSchedulerFactory.getScheduler();
    			sched.start();
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    
    	/**
    	 * @Description:关闭全部定时任务
    	 * 
    	 * 
    	 * @Title: QuartzManager.java
    	 * @Copyright: Copyright (c) 2014
    	 * 
    	 * @author Comsys-LZP
    	 * @date 2014-6-26 下午03:50:26
    	 * @version V2.0
    	 */
    	public static void shutdownJobs() {
    		try {
    			Scheduler sched = gSchedulerFactory.getScheduler();
    			if (!sched.isShutdown()) {
    				sched.shutdown();
    			}
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    	}
    }
    

    以上就是quartz任务调度对于任务的经常使用操作,封装起来以便在外部调用!这样我们就须要任务的运行了:
    /**
     * @Description: 
     *
     * @Title: QuartzJob.java
     * @Package com.joyce.quartz
     * @Copyright: Copyright (c) 2014
     *
     * @author Comsys-LZP
     * @date 2014-6-26 下午03:37:11
     * @version V2.0
     */
    package com.joyce.quartz;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    
    /**
     * @Description: 任务运行类
     *
     * @ClassName: QuartzJob
     * @Copyright: Copyright (c) 2014
     *
     * @author Comsys-LZP
     * @date 2014-6-26 下午03:37:11
     * @version V2.0
     */
    public class QuartzJob implements Job {
    
    	@Override
    	public void execute(JobExecutionContext arg0) throws JobExecutionException {
    		System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+ "★★★★★★★★★★★");  
    	}
    }
    

    Ok,我们来測试一下:
    /**
     * @Description: 
     *
     * @Title: QuartzTest.java
     * @Package com.joyce.quartz.main
     * @Copyright: Copyright (c) 2014
     *
     * @author Comsys-LZP
     * @date 2014-6-26 下午03:35:05
     * @version V2.0
     */
    package com.joyce.quartz.main;
    
    import com.joyce.quartz.QuartzJob;
    import com.joyce.quartz.QuartzManager;
    
    /**
     * @Description: 測试类
     *
     * @ClassName: QuartzTest
     * @Copyright: Copyright (c) 2014
     *
     * @author Comsys-LZP
     * @date 2014-6-26 下午03:35:05
     * @version V2.0
     */
    public class QuartzTest {
    	public static void main(String[] args) {
    		try {
    			String job_name = "动态任务调度";
    			System.out.println("【系统启动】開始(每1秒输出一次)...");  
    			QuartzManager.addJob(job_name, QuartzJob.class, "0/1 * * * * ?");  
    			
    			Thread.sleep(5000);  
    			System.out.println("【改动时间】開始(每2秒输出一次)...");  
    			QuartzManager.modifyJobTime(job_name, "10/2 * * * * ?");  
    			Thread.sleep(6000);  
    			System.out.println("【移除定时】開始...");  
    			QuartzManager.removeJob(job_name);  
    			System.out.println("【移除定时】成功");  
    			
    			System.out.println("【再次加入定时任务】開始(每10秒输出一次)...");  
    			QuartzManager.addJob(job_name, QuartzJob.class, "*/10 * * * * ?");  
    			Thread.sleep(60000);  
    			System.out.println("【移除定时】開始...");  
    			QuartzManager.removeJob(job_name);  
    			System.out.println("【移除定时】成功");
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    

    执行一下,看看效果图:


    至于定时的配置的话,有兴趣的各位能够去看看Quartz的cron表达式,这里就不给大伙儿介绍了哈!问问度娘,这资料非常全面地!最后来给附上本人的资源下载地址:http://download.csdn.net/download/luo201227/7603633

  • 相关阅读:
    mac上虚拟机:VMWare Fusion, VirtualBox, Parallels Desktop, CrossOver, Veertu
    linux使用其它用户 su
    CentOS7 rc.local开机开法启动
    taskkill
    Make sure that the controller has a parameterless public constructor.
    An Autofac Lifetime Primer
    Controlling Scope and Lifetime
    Instance scope
    Linq的TakeWhile的用法
    Git does not apply deleted files when merging an old branch into the master. How can I tell Git to apply deleted files?
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4069705.html
Copyright © 2020-2023  润新知