/*
* Copyright (c) 2014, S.F. Express Inc. All rights reserved.
*/
package com.sf.demo.util;
/**
* 描述:
*
* <pre>HISTORY
* ****************************************************************************
* ID DATE PERSON REASON
* 1 2014-9-9 sfit0272 Create
* ****************************************************************************
* </pre>
* @author sfit0272
* @since
*/
import java.util.Date;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.log4j.Logger;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
/**
* 定时器任务调度管理器
*
* @author
*/
public class QuartzManager {
private final String jobGroupName;
private final String triggerGroupName;
private Scheduler sched;
private final static SchedulerFactory sf = new StdSchedulerFactory();
private final static Map<String, QuartzManager> instanceMap = new ConcurrentHashMap<String, QuartzManager>();
private final static Logger logger = Logger.getLogger(QuartzManager.class);
/**
* 构造方法,外部不能实例化
*
* @param jobGroupName 工作组名
* @param triggerGroupName 触发器组名
*/
private QuartzManager(String jobGroupName, String triggerGroupName) {
this.jobGroupName = jobGroupName;
this.triggerGroupName = triggerGroupName;
}
/**
* 获取调度器
*
* @return 定时调度器
* @throws SchedulerException 调度器内部执行异常
*/
private Scheduler getScheduler() throws SchedulerException {
if (sched == null) {
sched = sf.getScheduler();
//sched.getListenerManager().addTriggerListener(new QuartzTriggerListener());
//sched.getListenerManager().addSchedulerListener(new QuartzSchedulerListener(sched));
}
return sched;
}
/**
* 获取一个定时调度管理器
*
* @param jobGroupName 工作组名
* @param triggerGroupName 触发器组名
* @return 定时调度管理器
*/
public static QuartzManager getInstance(String jobGroupName, String triggerGroupName) {
String instanceKey = jobGroupName + "_" + triggerGroupName;
if (instanceMap.containsKey(instanceKey)) {
return instanceMap.get(instanceKey);
}
QuartzManager manager = new QuartzManager(jobGroupName, triggerGroupName);
instanceMap.put(instanceKey, manager);
return manager;
}
/**
* 获取一个定时调度管理器
*
* @param groupName 工作组名和触发器组名相同
* @return 定时调度管理器
*/
public static QuartzManager getInstance(String groupName) {
return getInstance(groupName, groupName);
}
/**
* 关闭调度器
*
* @param waitForJobsToComplete 是否等候所有工作被调度完成后再关闭
*/
public void shutdown(boolean waitForJobsToComplete) {
String instanceKey = jobGroupName + "_" + triggerGroupName;
if (instanceMap.containsKey(instanceKey)) {
QuartzManager manager = instanceMap.get(instanceKey);
if (manager != null && manager.sched != null) {
try {
manager.sched.shutdown(waitForJobsToComplete);
} catch (SchedulerException ex) {
logger.debug(ex.getLocalizedMessage(), ex);
}
}
}
}
/**
* 关闭调度器
*/
public void shutdown() {
shutdown(false);
}
/**
* 添加一个调度任务
*
* @param jobName 任务名
* @param cls 任务类型
* @param start 任务执行的开始时间,null表示立刻执行
* @param end 任务执行的结束时间,null表示任务在执行repeat次数后自动结束
* @param jobBindData 绑定到job中的数据,可为null
* @param intervalType 任务执行时间间隔类型,1、毫秒,2、秒,3、分,4、小时,默认为2
* @param intervalValue 任务执行时间间隔
* @param repeat 任务执行次数,0表示执行一次,实际执行次数为此值+1
* @throws SchedulerException
*/
public void addJob(String jobName, Class cls, Date start, Date end, Map<String, Object> jobBindData, int intervalType, long intervalValue, int repeat) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(jobName, jobGroupName).build();
if (jobBindData != null) {
for (Entry<String, Object> entry : jobBindData.entrySet()) {
jobDetail.getJobDataMap().put(entry.getKey(), entry.getValue());
}
}
SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule();
switch (intervalType) {
case 1:
//毫秒
simpleScheduleBuilder.withIntervalInMilliseconds(intervalValue);
break;
case 3:
//分
simpleScheduleBuilder.withIntervalInMinutes((int) intervalValue);
break;
case 4:
//时
simpleScheduleBuilder.withIntervalInHours((int) intervalValue);
break;
default:
//秒
simpleScheduleBuilder.withIntervalInSeconds((int) intervalValue);
break;
}
if(repeat >= 0) {
simpleScheduleBuilder.withRepeatCount(repeat);
}
TriggerBuilder<org.quartz.Trigger> builder = TriggerBuilder.newTrigger()
.withIdentity(jobName, triggerGroupName);
if (start == null) {
builder.startNow();
} else {
builder.startAt(start);
}
if (end != null) {
builder.endAt(end);
}
Trigger trigger = builder.withSchedule(simpleScheduleBuilder).build();
Scheduler scheduler = getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
if (!scheduler.isShutdown()) {
scheduler.start();
}
}
/**
* 添加一个调度任务,在start时间执行一次
* @param jobName 任务名
* @param cls 任务类型
* @param start 任务执行的开始时间,null表示立刻执行
* @param end 任务执行的结束时间,null表示任务在执行repeat次数后自动结束
* @param jobBindData 绑定到job中的数据,可为null
* @throws SchedulerException
*/
public void addJob(String jobName, Class cls, Date start , Date end, Map<String, Object> jobBindData) throws SchedulerException {
this.addJob(jobName, cls, start, end, jobBindData, 2, 1, 0);
}
/**
* 添加一个调度任务,在start时间执行一次
* @param jobName 任务名
* @param cls 任务类型
* @param start 任务执行的开始时间,null表示立刻执行
* @param jobBindData 绑定到job中的数据,可为null
* @throws SchedulerException
*/
public void addJob(String jobName, Class cls, Date start, Map<String, Object> jobBindData) throws SchedulerException {
this.addJob(jobName, cls, start, null, jobBindData);
}
/**
* 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
*
* @param jobName 任务名
* @param cls
* @param time 时间设置,参考quartz说明文档
* @throws SchedulerException 调度器内部执行异常
*/
public void addJob(String jobName, Class cls, String time) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(jobName, jobGroupName).build();
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity(jobName, triggerGroupName)//触发器名,触发器组
.withSchedule(CronScheduleBuilder.cronSchedule(time))
.build();
Scheduler scheduler = getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
if (!scheduler.isShutdown()) {
scheduler.start();
}
}
/**
* 移除一个任务
*
* @param triggerKey 触发器键
* @param jobKey 工作任务键
* @throws SchedulerException 调度器内部执行异常
*/
public void removeJob(TriggerKey triggerKey, JobKey jobKey) throws SchedulerException {
Scheduler scheduler = getScheduler();
scheduler.pauseTrigger(triggerKey);
scheduler.unscheduleJob(triggerKey);
scheduler.deleteJob(jobKey);
}
/**
* 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobName 工作任务名
* @throws SchedulerException 调度器内部执行异常
*/
public void removeJob(String jobName) throws SchedulerException {
TriggerKey triggerKey = new TriggerKey(jobName, triggerGroupName);
JobKey jobKey = new JobKey(jobName, jobGroupName);
removeJob(triggerKey, jobKey);
}
}
分享到:
相关推荐
文件里面包括 1:Quartz开发指南.pdf 2:Quartz从入门到进阶.pdf 3:QuartzBeginnerExample一个附带的工程例子 4:quartz-1.6.1.zip Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它...
quartz quartz-1.8.6 dbTables quartz动态任务调度需要的数据库脚本。
quartz简单实例quartz简单实例quartz简单实例quartz简单实例
此ppt展示了Quartz调度的一些只是,看看吧
赠送jar包:quartz-2.3.2.jar; 赠送原API文档:quartz-2.3.2-javadoc.jar; 赠送源代码:quartz-2.3.2-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.2.pom; 包含翻译后的API文档:quartz-2.3.2-javadoc-API...
该压缩包内包含两个quartz的jar包, 分别是quartz-1.6.0.jar和quartz-all-1.6.0.jar
quartz-2.2.3版本的quartz初始化sql语句
Quartz是一个功能丰富的开源作业调度库,几乎可以集成在任何Java应用程序中 - 从最小的独立应用程序到最大的电子商务系统。Quartz可用于创建简单或复杂的计划,以执行数十,数百甚至数万个作业; 将任务定义为标准...
lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子
赠送jar包:quartz-2.3.0.jar; 赠送原API文档:quartz-2.3.0-javadoc.jar; 赠送源代码:quartz-2.3.0-sources.jar; 赠送Maven依赖信息文件:quartz-2.3.0.pom; 包含翻译后的API文档:quartz-2.3.0-javadoc-API...
Quartz1.5,Quartz1.6,Quartz1.8。Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个...
Quartz使用方法Quartz使用方法Quartz使用方法Quartz使用方法Quartz使用方法
Quartz.NET框架的核心是调度器。调度器负责管理Quartz.NET应用运行时环境。Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz.NET采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器...
quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则quartz 时间配置规则
Quartz原理及实例,spring4.x+Quartz.2.2.1结合的开发,静态和动态实例
quartz内部表.sql。
在 myeclipse6.0.1下调试成功可直接运行的spring的quartz的例子,很适合刚接触quartz调度学习。
Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件。 Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的...
Quartz使用指南 Quartz使用指南 Quartz使用指南
quartz调度jar