/*
* 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);
}
}
分享到:
相关推荐
Quartz:强大而灵活的Java任务调度框架 一、引言 随着现代Web应用程序框架的不断发展,其范围和复杂性也在逐步提升,这就要求应用程序的每个底层组件也必须相应地进化。作业调度作为现代系统中对Java应用程序的一项...
Quartz 是一个开源的作业调度框架,广泛应用于Java应用程序中,用于执行定时任务。它提供了丰富的API和灵活性,使得开发者可以方便地定义、安排和管理各种任务。版本1.8.6是Quartz的一个稳定版本,它包含了对数据库...
Quartz是Java领域的一款强大的开源任务调度框架,它允许开发者创建和管理定时任务,从而实现应用程序的自动执行功能。在给定的压缩包文件中,我们有两个版本为1.6.0的Quartz JAR包:`quartz-1.6.0.jar`和`quartz-all...
Quartz是一款广泛使用的开源任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。在Quartz 2.2.3版本中,初始化数据库是使用Quartz的关键步骤,因为Quartz依赖于一个持久化存储来保存作业和触发器的信息...
Quartz 批量下载源码,Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码Quartz 批量下载源码
Quartz 是一个开源的作业调度框架,广泛应用于Java企业级应用中,用于自动化任务执行,如定时触发工作流、发送邮件、数据同步等。在Quartz的部署和配置过程中,为了存储作业和触发器的信息,我们需要在关系型数据库...
Quartz是一款开源的作业调度框架,它允许开发者创建、组织和执行计划任务。这个实例是为初学者设计的,用于帮助理解Quartz的基本概念和使用方式。在MyEclipse 6.0.1环境下,你可以直接运行这个Spring整合Quartz的...
Quartz 是一个开源的作业调度框架,广泛应用于Java应用程序中,用于执行定时任务。它允许开发者灵活地定义作业和触发器,实现复杂的时间调度。在2.3.0这个版本中,Quartz 提供了针对不同数据库系统的初始化脚本,...
**Android Studio下的Quartz工程详解** Quartz是一个开源的作业调度框架,广泛应用于Java环境中的任务调度。在Android Studio中使用Quartz,可以为应用程序添加定时执行的任务功能,例如定期发送通知、更新数据或者...
Quartz和Spring-Quartz是两个在Java世界中广泛使用的定时任务管理框架。Quartz是一个开源的作业调度框架,允许应用程序定义和调度任务在特定时间执行。而Spring-Quartz则是Spring框架对Quartz的集成,它使得在Spring...
Quartz是一个功能丰富的开源作业调度库,几乎可以集成在任何Java应用程序中 - 从最小的独立应用程序到最大的电子商务系统。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 是一个开源的作业调度框架,它允许开发者在 Java 应用程序中安排任务的执行。线程池是 Quartz 的核心组成部分,用于管理和执行触发的任务。本文将深入探讨 Quartz 线程池的工作原理、配置以及如何在实际项目...
Quartz是一款开源的作业调度框架,它允许开发者在Java应用程序中定义和执行复杂的定时任务。在Java应用开发中,Quartz常被用来自动化各种后台任务,如数据清理、报告生成等。"Quartz所需jar包"是使用Quartz库进行...
在Spring框架中集成Quartz是一款常见的任务调度解决方案,它允许开发者在应用中安排定时任务的执行。Quartz是一个开源的作业调度框架,可以用来在Java应用程序中安排复杂的作业任务。以下将详细介绍如何在Spring中...
quartz scheduler 入门教程 Quartz Scheduler 是一种功能丰富、开源的任务调度程序库,可以在任何 Java 程序中使用。它可以用来创建简单或者复杂的执行次数可以达成千上万的任务。任务可以是任何 Java 可以做的事情...
### Java框架介绍: Quartz从入门到进阶 #### 一、Quartz简介 Quartz是一个完全由Java编写的开源作业调度框架,适用于多种Java应用程序环境,包括但不限于J2SE、Web应用以及J2EE应用服务器。它提供了一种简单而灵活...
文件里面包括 1:Quartz开发指南.pdf 2:Quartz从入门到进阶.pdf 3:QuartzBeginnerExample一个附带的工程例子 4:quartz-1.6.1.zip Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它...
### 深入解读Quartz的原理 #### 一、Quartz概述 Quartz 是一个功能强大且易于使用的 Java 开源定时任务调度器。它能够触发在指定的时间执行任务(通常称为作业)。Quartz 能够满足从简单的到非常复杂的业务场景...
lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子lucene quartz 例子