Java任务调度器Quartz介绍
1. Quartz介绍
维基百科:Quartz是一个Java下作业控制的开源框架。Quartz用来创建或简单或复杂的调度时间表,执行Java下任意数量的作业。版本1.0发布于2002年9月13日,当前版本2.2.1发布于2013年9月24日。
可以通过CronTrigger定义Quartz的调度时间表(例如0 0 12 ? * WED表示“每周三上午12:00”)。此外,时间表也可以通过SimpleTrigger,由Date定义触发的开始时间、毫秒的时间间隔和重复计数(例如“在下周三12:00,然后每隔10秒、执行5次”)。可以使用Calender定义例外的日程(例如“没有周末和节假日”)。
作业可以是实现了Job接口任意的Java类。作业监听器(JobListener)和触发器监听器(TriggerListener)通知作业的执行(和其他事件)。作业及其触发器可以被持久化。
Quartz一般用于企业级应用程序,以支持工作流、系统管理(维护)活动,并在应用程序中提供实时的服务。Quartz还支持集群。
Quartz是Terracotta公司的开源产品。 .NET平台下的对应产品叫Quartz.NET。
2. 核心组件JobDetail
JobDetai是quartz框架核心组件之一,他的作用是绑定需要执行业务逻辑的类,具体代码结构如下
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).withIdentity("job名称", "job组").build();
- job每次调用都会创建一个新的实例,newJob里面的参数,便是开发者自己业务逻辑的代码,这个类需要实现一个接口Job,他有一个唯一的方法execute(JobExecutionContext context),这个方法里面的参数JobExecutionContext 的作用就是我们可以获取从Scheduler里面传递过来的各种参数。例如:
刚才的JobDetail实例中可以使用usingJobData这个链式写法来传递我们的参数
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).usingJobData("传递值key", "传递值Value").withIdentity("myJob", "jobGroup").build();
那么我们如何在Job类里面获取呢?(这里介绍最简单的一种方式,使用getJobDataMap()的方式不再介绍。)
//我们创建一个与usingJobData(key,value)的key相同名称的字符串
private String key;
//实现他的get与set方法
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
//直接获取
System.out.println(key);
3.聊聊Trigger
- trigger同样是quartz框架的核心组件,他是用来处理调度任务的核心所在,有了他,可以设置我们的调度任务多久执行,执行多少次,什么时候开始,结束。用的最多的是SimpleTrigger与CronTriger,我们先看一个SimpleTrigger如何创建的:
//这里创建的是每秒都执行一下我们的任务,永远的执行下去
SimpleTrigger simpleTrigger=(SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trrigerName","triggerGroup")
.startNow().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1)).build();
- 接下来是重点的CronTrigger,说到这个我们CronTrigger就不得不提Cron表达式Cron表达式百度一大把,这里就不赘述了。
//这个表达式和上面是一样的功能,也是每秒执行一次,永远执行下去
CronTrigger cronTrigger=(CronTrigger) TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?")).withIdentity("triggerName", "triggerGroup").build();
- Cron表达式:
秒 分 时 日 月 周 年
比如2017年的10月1日15点0分0秒执行,每5分秒钟执行一次
0/5 0 15 1 10 ? 2017 这里周不关心,填写?就行了。/表示每,-表示至,比如10-16表示10到16,*和?代表任意等等。
3.Scheduler
Scheduler实际上按照我的理解就是一个启动器,他绑定不同的JobDetail和Trigger,然后控制他们执行调度任务。
//采用工厂的模式创建Scheduler
SchedulerFactory schedulerFactory=new StdSchedulerFactory();
Scheduler scheduler=schedulerFactory.getScheduler();
//绑定JobDetail和Trigger
scheduler.scheduleJob(jobDetail,simpleTrigger);
//执行任务调度。
scheduler.start();
4.总结
这些其实是quartz的基本入门知识,要深入理解还需要查阅网上的资料。但是对于我们工作来说,如果用不到,那就当做一个了解,以后用到的时候,非常的容易上手,而且现在企业使用quartz比较多,可能也能成为我们面试的一个必备技能。
5.附上源码
- HelloJob.class
public class HelloJob implements Job{
private String key;
public void execute(JobExecutionContext context) throws JobExecutionException {
// TODO Auto-generated method stub
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前job执行时间为:"+sdf.format(date));
JobDetail jobDetail=context.getJobDetail();
JobKey jobKey=jobDetail.getKey();
System.out.println("当前执行job信息:"+"job名称-->"+jobKey.getName()+"job组-->"+jobKey.getGroup());
Trigger trigger=context.getTrigger();
System.out.println("当前执行的Trigger信息:"+"trigger名称-->"+trigger.getJobKey().getName()+"trigger组-->"+trigger.getJobKey().getGroup());
System.out.println("Hello World");
System.out.println(key);
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
- TestScheduler.class
public static void main(String[] args) throws SchedulerException {
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前系统时间为:"+sdf.format(date));
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class).usingJobData("key", "Value").withIdentity("myJob", "jobGroup").build();
// CronTrigger cronTrigger=(CronTrigger) TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?"))
// .withIdentity("triggerName", "triggerGroup").build();
SimpleTrigger simpleTrigger=(SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trrigerName","triggerGroup")
.startNow().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1)).build();
SchedulerFactory schedulerFactory=new StdSchedulerFactory();
Scheduler scheduler=schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail,simpleTrigger);
scheduler.start();
}