什么是Quartz
-
- Quartz是一个开源的作业调度框架,由java编写,在.NET平台为Quartz.Net,通过Quart可以快速完成任务调度的工作.
- Quartz能干什么/应用场景
- 如网页游戏中挂机自动修炼如8个小时,人物相关数值进行成长,当使用某道具后,时间减少到4个小时,人物对应获得成长值.这其中就涉及到了Scheduler的操作,定时对人物进行更新属性操作,更改定时任务执行时间.
- 网页游戏中会大量涉及到Scheduler的操作,有兴趣的朋友可自行联想.
- 企业中如每天凌晨2点触发数据同步、发送Email等操作
- 同类框架对比
- TimeTask TimeTask在Quartz前还是显得过于简单、不完善,不能直接满足开发者的较为复杂的应用场景.
- 资源
- 官网:http://www.quartz-scheduler.org/
- 下载:http://www.quartz-scheduler.org/downloads
- maven pom
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
二、首先,要创建一个任务,quartz规定任务必须实现org.quarta.Job接口,此接口就一个方法execute,这个方法就是任务执行的时候允许的方法,具体的业务实现在这个方法里,我这里只进行了简单的打印。
package com.tiexiu.myScheduler;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job{
public void execute(JobExecutionContext context) throws JobExecutionException {
String jobname = context.getTrigger().getJobKey().getName(); //可以通过context参数获取job名等
System.out.println("Hello World!");
}
}
三、创建完任务之后,我们还要创建一个包含任务信息的jobDetail,一个管理任务执行的促发器trigger,最后就是调度任务。
package com.tiexiu.myScheduler;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.core.jmx.JobDetailSupport;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzBean {
static SchedulerFactory schedulerfactory = new StdSchedulerFactory();
static Scheduler scheduler = null;
/**
* 添加定时任务
*
* @param date 任务开始时间
* @param job 任务处理类 需要继承Job
* @param jobGorupName 任务组名
* @param jobName 任务名称
* @return 0 添加成功 1:任务已经存在 2:添加异常
* @throws SchedulerException
*/
public static int addJob(Date date,Class<? extends Job> job,
String jobGorupName,String jobName) {
try {
// 创建一个SchedulerFactory工厂实例
scheduler = schedulerfactory.getScheduler();
JobKey jobKey = JobKey.jobKey(jobName, jobGorupName);
if (scheduler.checkExists(jobKey)) {
return 1;// 任务已经存在
}
// 用于描叙Job实现类及其他的一些静态信息,构建一个作业实例
// 创建一个JobDetail实例,指定SimpleJob
Map<String, Object> JobDetailmap = new HashMap<String, Object>();
JobDetailmap.put("name", jobName);// 设置任务名字
JobDetailmap.put("group", jobGorupName);// 设置任务组
JobDetailmap.put("jobClass", job.getCanonicalName());// 指定执行类
JobDetail jobDetail;
jobDetail = JobDetailSupport.newJobDetail(JobDetailmap);
// 添加数据内容
// jobDetail.getJobDataMap().put("task", task);// 传输的上下文
// 构建一个触发器,规定触发的规则
Trigger simpleTrigger = TriggerBuilder// 创建一个新的TriggerBuilder来规范一个触发器
.newTrigger()// 给触发器起一个名字和组名
.withIdentity(jobName, jobGorupName)
// .startNow()//立即执行
.startAt(date)
.build();// 产生触发器
// 向Scheduler中添加job任务和trigger触发器
scheduler.scheduleJob(jobDetail, simpleTrigger);
// 启动
scheduler.start();
return 0;
} catch (Exception e) {
e.printStackTrace();
return 2;// 操作异常
}
}
/**
* 关闭任务调度
*
* @param jobName
* 任务名称
* @return 0 关闭成功 1: 关闭失败 2:操作异常
* @throws SchedulerException
*/
public static int closeJob(String jobName, String jobGorupName) {
// 关闭任务调度
try {
scheduler = schedulerfactory.getScheduler();
JobKey jobKey = JobKey.jobKey(jobName, jobGorupName);
return scheduler.deleteJob(jobKey) == true ? 0 : 1;
} catch (SchedulerException e) {
return 2;
}
}
}