quartz基本介绍
Posted haizhilangzi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了quartz基本介绍相关的知识,希望对你有一定的参考价值。
Quartz基本介绍
简介
Quartz是一个功能强大的开源任务调度框架,几乎可以继承到任何java应用程序。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。同时Quartz Scheduler包含许多企业级功能,例如对JTA事务和集群的支持
简单实例
该实例用来在下一分钟执行一个helloJob
public class HelloJobMain { public static void main(String[] args) throws Exception { // DirectSchedulerFactory directSchedulerFactory = DirectSchedulerFactory.getInstance(); //创建一个调度工厂对象,并从里面获取一个调度器 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); //获取当前时间的下一分钟 Date runTime = DateBuilder.evenMinuteDate(new Date()); //定义一个job jobkey名称 jobkey 组 JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build(); JobDataMap jobDataMap = job.getJobDataMap(); //JobDataMap jobDataMap=new JobDataMap(); jobDataMap.put("zhangsan",23); //定义一个定时器 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build(); scheduler.getContext().put("lisi",24); scheduler.scheduleJob(job, trigger); scheduler.start(); Thread.sleep(65L * 1000L); scheduler.shutdown(true); } }
public class HelloJob implements Job { /** * @param jobExecutionContext * @throws JobExecutionException */ @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("HelloJob 任务执行啦"); JobDetail jobDetail = jobExecutionContext.getJobDetail(); JobKey key = jobDetail.getKey(); Trigger trigger = jobExecutionContext.getTrigger(); TriggerKey key1 = trigger.getKey(); JobDataMap mergedJobDataMap = jobExecutionContext.getMergedJobDataMap(); System.out.println(mergedJobDataMap.get("zhangsan")); SchedulerContext context = null; try { context = jobExecutionContext.getScheduler().getContext(); } catch (SchedulerException e) { e.printStackTrace(); } System.out.println(context.get("lisi")); } }
上面代码是创建一个Job的基本步骤,即包括:
1、创建SchedulerFactory工厂对象,并从中获取一个Scheduler
2、创建一个JobDetail
3、创建一个触发器即Trigger
4、注册到Scheduler,即scheduler.scheduleJob(job, trigger);
5、启动Scheduler,即scheduler.start();
核心类与接口
Job:是一个接口,里面有一个方法public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException,开发者在开发调度任务的时候,只需要实现该接口即可。JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap,也可以保存在SchedulerContext中。
JobDetail:传递给定Job实例的详细信息,包括Job名字以及所属的组
Trigger:触发Job执行的时间的规则。主要有CalendarIntervalTrigger,CronTrigger,DailyTimeIntervalTrigger,SimpleTrigger,常用的有SimpleTrigger和CronTrigger两个。
? CalendarIntervalTrigger:按照固定的时间间隔来触发任务。比如:使用月作为间隔单位,不小心设置为月底的最后一天,比如1月31号,Trigger的Unit为month,interval是1,则下一个触发为2月28号,之后再次触发为3月28号,依次类推。
? DailyTimeIntervalTrigger:跟CalendarIntervalTrigger类似,比如:Trigger设置在8:00~11:00之间,每72分钟执行一次,则执行时间为8:00, 9:12, 10:24,下次执行时间为第二天的8:00, 9:12, 10:24。
? CronTrigger:按照Cron表达式给定的时间触发任务
? SimpleTrigger:用来触发只需执行一次或者在给定时间触发并且重复N次且每次执行延迟一定时间的任务。
Scheduler:代表一个Quartz的独立运行容器,Trigger和JobDetail可以注册到Scheduler中,两者在Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法,允许外部通过组及名称访问和控制容器中Trigger和JobDetail。
ThreadPool:Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。
JobStore: 通过类实现的接口,这些类要为org.quartz.core.QuartzScheduler的使用提供一个org.quartz.Job和org.quartz.Trigger存储机制。作业和触发器的存储应该以其名称和组的组合为唯一性。
QuartzSchedulerResources:包含创建QuartzScheduler实例所需的所有资源(JobStore,ThreadPool等)。
SchedulerFactory :提供用于获取调度程序实例的客户端可用句柄的机制
QuartzSchedulerThread:负责执行向QuartzScheduler注册的触发Trigger的工作的线程。Cron表达式
结构: corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份
字段 允许值 允许特殊字符 Seconds 0-59 , - * / Minutes 0-59 , - * / Hours 0-23 , - * / Day-of-month 1-31 , - * ? / L W Month 0-11 or JAN-DEC , - * / Day-of-Week 1-7 or SUN-SAT , - * ? / L # Year (Optional) empty, 1970-2199 , - * / *号:代表任意的值,比如:在minutes代表任意每一分钟
?号:用于day-of-month 和 day-of-week,表示不匹配任何值
-号:比如用在hour字段,10-12 表示匹配10,11,12
,号:表示枚举值,比如在day-of-week:MON,WED,FRI代表Monday, Wednesday, 和Friday
/号: 表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.
L号:表示最后,用在day-of-month 和day-of-week, 如果在day-of-week域使用5L,意味着在最后的一个星期四触发。
W号:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。
LW号:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
#号:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。
表达式 含义 0 0 12 * * ? 表示每天12点执行 0 15 10 ? * * 每天10:15am执行 0 15 10 * * ? 每天10:15am执行 0 15 10 * * ? * 每天10:15am执行 0 15 10 * * ? 2005 2005年每天10:15am执行 0 * 14 * * ? 每天从2:00pm到2:59pm每分钟执行 0 0/5 14 * * ? 每天从2:00pm到2:59pm每5分钟执行 0 0/5 14,18 * * ? 每天2:00pm到2:59pm和6:00pm到6:59pm,每5分钟执行一次 0 0-5 14 * * ? 每天2:00pm到2:05pm每分钟执行 0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发 0 15 10 ? * MON-FRI 周一至周五的上午10:15触发 0 15 10 15 * ? 每月15日上午10:15触发 0 15 10 L * ? 每月最后一日的上午10:15触发 0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发 0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发 0 15 10 ? * 6#3 每月的第三个周五上午10:15触发
相关源码参考: https://github.com/albert-liu435/springquartz
以上是关于quartz基本介绍的主要内容,如果未能解决你的问题,请参考以下文章