1.Job类
package com.bobo.quartz.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* @author bobo
*/
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("吴晓波是个大帅哥");
}
}
2.定时任务
package com.bobo.quartz;
import com.bobo.quartz.job.JobWithData;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
/**
*/
/**
* job的工作原理:
* 在创建JobDetail的时候,将要执行的job的类名传给了JobDetail,所以Scheduler知道要执行什么任务,当定时执行这个任务的时候,
* 都要创建一个job实例,当执行完成之后,对该实例就丢弃,实例被垃圾回收机制回收。所以必须要有无参构造函数。另外一个在job类中,
* 不应该定义有状态的数据属性。
* 给job增加属性和配置,是使用jobdataMap。这个类是map的一个子类。
* 如果你在job类中,为JobDataMap中存储的数据的key增加set方法(如在上面示例中,增加setJobSays(String val)方法),
* 那么Quartz的默认JobFactory实现在job被实例化的时候会自动调用这些set方法,这样你就不需要在execute()方法中显式地从map中取数据了。
* JobExecutionContext中的JobDataMap为我们提供了很多的便利。它是JobDetail中的JobDataMap和Trigger中的JobDataMap的并集,
* 但是如果存在相同的数据,则后者会覆盖前者的值。
*/
/**
* 你有N个trigger需要同时触发,但只有Z个工作线程,优先级最高的Z个trigger会被首先触发。如果没有为trigger设置优先级,trigger使用默认优先级,值为 * 5;priority属性的值可以是任意整数,正数、负数都可以。
* 注意:只有同时触发的trigger之间才会比较优先级。10:59触发的trigger总是在11:00触发的trigger之前执行。
*/
/**
* 日历示例(calendar)Quartz的Calendar对象(不是java.util.Calendar对象)可以在定义和存储trigger的时候与trigger进行关联。Calendar用于从trigger的调度计划中排除时间段。比如,可以创建一个trigger,每个工作日的上午9:30执行,然后增加一个Calendar,排除掉所有的商业节日。
*/
public class QuartzWithData {
public static void main(String[] args) throws SchedulerException {
//调度工具
SchedulerFactory factory=new StdSchedulerFactory();
//获取调度实例
Scheduler scheduler=factory.getScheduler();
//开始一个调度
scheduler.start();
//用于定义作业的实例,其中hellojob实现了job这个接口
JobDetail jobDetail= JobBuilder.newJob(JobWithData.class)
.usingJobData("Hello","Hello World")
.withIdentity("myJob","group1")
.build();
//触发器,定义执行给定作业的计划的组件
Trigger trigger=TriggerBuilder.newTrigger()
.withIdentity("myTrigger","group1")
.startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10).repeatForever())
.build();
scheduler.scheduleJob(jobDetail,trigger);
}
}
3.Calendar的使用
package com.bobo.quartz;
import com.bobo.quartz.job.JobWithData;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.HolidayCalendar;
import java.util.Date;
import static org.quartz.CronScheduleBuilder.dailyAtHourAndMinute;
/**
*/
/**
* 日历示例(calendar)Quartz的Calendar对象(不是java.util.Calendar对象)可以在定义和存储trigger的时候与trigger进行关联。Calendar用于从trigger的调度计划中排除时间段。比如,可以创建一个trigger,每个工作日的上午9:30执行,然后增加一个Calendar,排除掉所有的商业节日。
* 调度添加假日的参数说明:
* calName : 假日的标识。
* Calendar:Calendar对象
* replace:源代码中的解释如下: if there is an internal Scheduler error, or a Calendar with
* the same name already exists, and <code>replace</code> is
* <code>false</code>.翻译过来的意思是说 如果调度有错误,或者是已经存在了一个同名的Calender。是否需要代替
* updateTriggers:源代码中的解释如下:
* whether or not to update existing triggers that
* referenced the already existing calendar so that they are 'correct'
* based on the new trigger.翻译过来的意思是:是否更新现有的触发器。这个触发器引用了已经存在的日历,以便它们基于新的触发器是正确的。
*/
public class QuartzWithCalendar {
public static void main(String[] args) throws SchedulerException {
//调度工具
SchedulerFactory factory=new StdSchedulerFactory();
//获取调度实例
Scheduler scheduler=factory.getScheduler();
HolidayCalendar holidayCalendar=new HolidayCalendar();
holidayCalendar.addExcludedDate(new Date());
scheduler.addCalendar("myholiday",holidayCalendar,false,false);
//开始一个调度
scheduler.start();
JobDetail jobDetail= JobBuilder.newJob(JobWithData.class)
.usingJobData("Hello","Hello World")
.withIdentity("myJob","group1")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myJob","group1")
.withSchedule(dailyAtHourAndMinute(9, 30)) // execute job daily at 9:30
.modifiedByCalendar("myHolidays") // but not on holidays
.build();
scheduler.scheduleJob(jobDetail,trigger);
}
}