标签:thread style 程序 不同类 tar one 应用 res RKE
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的工作的线程。
结构: 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
标签:thread style 程序 不同类 tar one 应用 res RKE
原文地址:https://www.cnblogs.com/haizhilangzi/p/10914085.html