Java Quartz的使用方法,实现程序计时
2012-08-22 18:00
549 查看
1.实现一个管理类 ,对计时的程序进行管理
import java.text.ParseException; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory; /** * 定时任务管理类 */ public class QuartzManager { //SchedulerFactory 是创建定时任务的工厂 private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory(); private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";//默认的任务组 private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";//默认计时器组 /** * 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名 * * @param jobName 任务名 * @param jobClass 任务 * @param time 时间设置,参考quartz说明文档 * @throws SchedulerException * @throws ParseException */ public static void addJob(String jobName, String jobClass, String time) { try { //获取一个Scheduler Scheduler sched = gSchedulerFactory.getScheduler(); //创建一个任务 JobDetail /** * 参数1 任务名称 * 参数2 任务组名 * 参数3 任务执行的类 */ JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, Class.forName(jobClass));// 任务名,任务组,任务执行类 // 触发器 CronTrigger /** * 参数1 任务名称 * 参数2 触发器组名 */ CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组 trigger.setCronExpression(time);// 触发器时间设定 //将 任务 和触发器 装进Scheduler sched.scheduleJob(jobDetail, trigger); // 启动 if (!sched.isShutdown()){ sched.start(); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } /** * 添加一个定时任务 * * @param jobName 任务名 * @param jobGroupName 任务组名 * @param triggerName 触发器名 * @param triggerGroupName 触发器组名 * @param jobClass 任务 * @param time 时间设置,参考quartz说明文档 * @throws SchedulerException * @throws ParseException */ public static void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, String jobClass, String time){ try { Scheduler sched = gSchedulerFactory.getScheduler(); JobDetail jobDetail = new JobDetail(jobName, jobGroupName, Class.forName(jobClass));// 任务名,任务组,任务执行类 // 触发器 CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 触发器名,触发器组 trigger.setCronExpression(time);// 触发器时间设定 sched.scheduleJob(jobDetail, trigger); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } /** * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名) * * @param jobName * @param time */ @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(); String jobClass = objJobClass.getName(); removeJob(jobName); addJob(jobName, jobClass, time); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } /** * 修改一个任务的触发时间 * * @param triggerName * @param triggerGroupName * @param time */ 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) { e.printStackTrace(); throw new RuntimeException(e); } } /** * 移除一个任务(使用默认的任务组名,触发器名,触发器组名) * * @param jobName */ 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) { e.printStackTrace(); throw new RuntimeException(e); } } /** * 移除一个任务 * * @param jobName * @param jobGroupName * @param triggerName * @param triggerGroupName */ 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) { e.printStackTrace(); throw new RuntimeException(e); } } /** * 启动所有定时任务 */ public static void startJobs() { try { Scheduler sched = gSchedulerFactory.getScheduler(); sched.start(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } /** * 关闭所有定时任务 */ public static void shutdownJobs() { try { Scheduler sched = gSchedulerFactory.getScheduler(); if(!sched.isShutdown()) { sched.shutdown(); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } }2.供定时程序调用的接口
import org.quartz.Job; /** * * 供需要定时的程序调用 */ public interface InitiativeCollector extends Job { /** * 获得Job定时时间 * ---------------------------- * 【位置说明】: * 1 - 秒(0–59) * 2 - 分(0–59) * 3 - 时(0–23) * 4 - 日(1–31) * 5 - 月(1–12) * 6 - 星期(SUN–SAT or 1–7) * 7 - 年(可选, 1970–2099) * -------------------------------- * 【符号说明】 * 0 0 12 * * ?---------------在每天中午12:00触发 * 0 15 10 ? * *---------------每天上午10:15 触发 * 0 15 10 * * ?---------------每天上午10:15 触发 * 0 15 10 * * ? *---------------每天上午10:15 触发 * 0 15 10 * * ? 2005---------------在2005年中的每天上午10:15 触发 * 0 * 14 * * ?---------------每天在下午2:00至2:59之间每分钟触发一次 * 0 0/5 14 * * ?---------------每天在下午2:00至2:59之间每5分钟触发一次 * 0 0/5 14,18 * * ?---------------每天在下午2:00至2:59和6:00至6:59之间的每5分钟触发一次 * 0 0-5 14 * * ?---------------每天在下午2:00至2:05之间每分钟触发一次 * 0 10,44 14 ? 3 WED---------------每三月份的星期三在下午2:00和2:44时触发 * 0 15 10 ? * MON-FRI---------------从星期一至星期五的每天上午10:15触发 * 0 15 10 15 * ?---------------在每个月的每15天的上午10:15触发 * 0 15 10 L * ?---------------在每个月的最后一天的上午10:15触发 * 0 15 10 ? * 6L---------------在每个月的最后一个星期五的上午10:15触发 * 0 15 10 ? * 6L 2002-2005---------------在2002, 2003, 2004 and 2005年的每个月的最后一个星期五的上午10:15触发 * 0 15 10 ? * 6#3---------------在每个月的第三个星期五的上午10:15触发 * 0 0 12 1/5 * ?---------------从每月的第一天起每过5天的中午12:00时触发 * 0 11 11 11 11 ?---------------在每个11月11日的上午11:11时触发 * @return */ String getTimer(); }3.需要调用时只需要实现接口传入所需启动的时间即可 和复写 Job中的execute()方法执行所需的操作 。
import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Collector implements InitiativeCollector { @Override public String getTimer() { //每周日的晚上23:30转上周的周统计数据 return "0 30 23 ? * SUN"; } @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { // 执行操作 } }4.调用addJob
void addJob(String name,InitiativeCollector collector){ QuartzManager.addJob(name, collector.getClass().getName(), collector.getTimer()); }
相关文章推荐
- 用Swig将c/c++程序转为java代码(使用swig实现java调用c、c++的方法)
- 使用Java语言借助Quartz jar包实现定时器的方法
- Java开发桌面程序SWING,设置主窗口位置居中一般使用下面的方法
- 【Java程序】tesseract_orc java上的一种实现方法
- Quartz使用-入门使用(java定时任务实现)
- 使用Spring的Quartz方式实现Java定时器功能
- Quartz使用-入门使用(java定时任务实现)
- Java程序中添加播放MIDI音乐功能的实现方法详解
- java使用jsp servlet来防止csrf 攻击的实现方法
- 使用handleEvent()方法,action()方法和mouseDown()方法处理事件的JAVA Application程序.
- Java集合对象的排序使用Collection.sort方法,先实现Comparable接口
- handler的使用---如何实现Android计时与倒计时的几种方法
- Java中使用接口实现多继承和多态的方法
- 使用java写一个没有main方法的“Hello World”程序(摘自java核心技术.卷I)
- java 使用axis实现WebServise简单方法
- C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法
- Quartz使用-入门使用(java定时任务实现)
- java中有几种方法可以实现一个线程?用什么关键字修饰同步方法 stop()和suspend()方法为何不推荐使用?
- java使用jsp servlet来防止csrf 攻击的实现方法