Quartz简单理解
Quartz是一个任务调度框架。比如你遇到这样的问题
- 想每天早上8点给自己定一个闹钟
- 想每年2月14日自己给自己的女神发一封贺卡
- 想每隔2个小时,下载一部小电影到云盘
这些问题总结起来就是:在某一个指定的的时间段内干某件事。并且时间的触发的条件可以非常复杂(比如每月最后一个工作日的17:50),复杂到需要一个专门的框架来干这个事。 Quartz就是来干这样的事,你给它一个触发条件的定义,它负责到了时间点,触发相应的Job起来干活。
一个简单的示例
package cn.quartz.job; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.text.SimpleDateFormat; import java.util.Date; /** * * 一个数据库备份的工作 * * @author JP * @create 2019/1/17 0017 * @since 1.0.0 */ public class HelloJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { //输出时间 Date date=new Date(); SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time=format.format(date); System.out.println("正在进行数据库备份工作,备份时间是:"+time); } }
几个概念搞清楚先:
- 触发器 Trigger: 什么时候工作
- 任务 Job: 做什么工作
- 调度器 Scheduler: 搭配 Trigger和Job
package cn.quartz.main; import cn.quartz.job.HelloJob; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; /** * * * @author JP * @create 2019/1/17 0017 * @since 1.0.0 */ public class HelloSchedulerDemo { public static void main(String[] args) throws Exception { //1.调度器(Scheduler) ,从工厂中获取调度实例(默认:实例化 new StdSchedulerFactory();) Scheduler scheduler=StdSchedulerFactory.getDefaultScheduler(); //2.任务实例 JobDetail jobDetail= JobBuilder.newJob(HelloJob.class) //加载任务类,与hellojob完成绑定 .withIdentity("job1","group") //参数1:任务的名称(唯一实例);参数2:任务组的名称 .build(); //3.触发器(Tigeer) Trigger trigger= TriggerBuilder.newTrigger() .withIdentity("trigger","group1") //参数1:触发器名称 参数2:组名称 .startNow() //马上启动 .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(5) //每过5秒执行一次 .withRepeatCount(5)) //共执行6次 换成repeatForever() 的话,一直执行 .build(); //调度器关联任务和触发器,保证按照触发器定义条件执行任务 scheduler.scheduleJob(jobDetail,trigger); //启动 scheduler.start(); //等待30秒,让前面的任务都执行完了之后,再关闭调度器 Thread.sleep(30000); scheduler.shutdown(true); } }
执行效果