您的位置:首页 > 编程语言 > Java开发

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());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: