发表于: 2019-10-24 21:42:38
1 840
今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin)
一:学习quartz
Quartz API
- Scheduler - 与调度程序交互的主要API。搭配trigger和job
- Job - 由希望由调度程序执行的组件实现的接口。做什么工作
- JobDetail - 用于定义作业的实例。
- Trigger(即触发器) - 定义执行给定作业的计划的组件。什么时候工作
- JobBuilder - 用于定义/构建JobDetail实例,用于定义作业的实例。
- TriggerBuilder - 用于定义/构建触发器实例。
job管理:
Job 组成部分
Job 其实是由 3 个部分组成:
JobDetail: 用于描述这个Job是做什么的
实现Job的类: 具体干活的
JobDataMap: 给 Job 提供参数用的
JobDataMap 除了usingJobData 方式之外,还可以是其他方式,像这样
job.getJobDataMap().put("email", "admin@taobao.com");
Job 并发
默认的情况下,无论上一次任务是否结束或者完成,只要规定的时间到了,那么下一次就开始。
有时候会做长时间的任务,比如数据库备份,这个时候就希望上一次备份成功结束之后,才开始下一次备份,即便是规定时间到了,也不能开始,因为这样很有可能造成 数据库被锁死 (几个线程同时备份数据库,引发无法预计的混乱)。
那么在这种情况下,给数据库备份任务增加一个注解就好了:
@DisallowConcurrentExecution
Job 异常
任务里发生异常是很常见的。 异常处理办法通常是两种:
1. 当异常发生,那么就通知所有管理这个 Job 的调度,停止运行它
2. 当异常发生,修改一下参数,马上重新运行
中断 Job
在业务上,有时候需要中断任务,那么这个Job需要实现 InterruptableJob 接口,然后就方便中断了
SimpleTrigger
Trigger 就是触发器的意思,用来指定什么时间开始触发,触发多少次,每隔多久触发一次.
SimpleTrigger 可以方便的实现一系列的触发机制。
下一个8秒的倍数
SimpleTrigger可以满足的调度需求是:在具体的时间点执行一次,或者在具体的时间点执行,并且以指定的间隔重复执行若干次。比如,你有一个trigger,你可以设置它在2015年1月13日的上午11:23:54准时触发,或者在这个时间点触发,并且每隔2秒触发一次,一共重复5次。
SimpleTrigger的属性包括:开始时间、结束时间、重复次数以及重复的间隔。这些属性的含义与你所期望的是一致的,只是关于结束时间有一些地方需要注意。
重复次数,可以是0、正整数,以及常量SimpleTrigger.REPEAT_INDEFINITELY。重复的间隔,必须是0,或者long型的正数,表示毫秒。注意,如果重复间隔为0,trigger将会以重复次数并发执行(或者以scheduler可以处理的近似并发数)。
如果你还不熟悉DateBuilder,了解后你会发现使用它可以非常方便地构造基于开始时间(或终止时间)的调度策略。
endTime属性的值会覆盖设置重复次数的属性值;比如,你可以创建一个trigger,在终止时间之前每隔10秒执行一次,你不需要去计算在开始时间和终止时间之间的重复次数,只需要设置终止时间并将重复次数设置为REPEAT_INDEFINITELY(当然,你也可以将重复次数设置为一个很大的值,并保证该值比trigger在终止时间之前实际触发的次数要大即可)。
SimpleTrigger实例通过TriggerBuilder设置主要的属性,通过SimpleScheduleBuilder设置与SimpleTrigger相关的属性。要使用这些builder的静态方法,需要静态导入:
指定时间开始触发,不重复:
SimpleTrigger trigger = (SimpleTrigger) newTrigger()
.withIdentity("trigger1", "group1")
.startAt(myStartTime) // some Date
.forJob("job1", "group1") // identify job with name, group strings
.build();
指定时间触发,每隔10秒执行一次,重复10次:
trigger = newTrigger()
.withIdentity("trigger3", "group1").startAt(myTimeToStartFiring) // 如果未指定开始时间(如果省略了此行),则表示“现在”
.withSchedule(simpleSchedule()
.withIntervalInSeconds(10)
.withRepeatCount(10)) // 注意重复十次,执行十一次
.forJob(myJob) // identify job with handle to its JobDetail itself
.build();
5分钟以后开始触发,仅执行一次:
trigger = (SimpleTrigger) newTrigger()
.withIdentity("trigger5", "group1").startAt(futureDate(5, IntervalUnit.MINUTE)) // 使用DateBuilder创建将来的日期
.forJob(myJobKey) // identify job with its JobKey
.build();
立即触发,每个5分钟执行一次,直到22:00:
trigger = newTrigger()
.withIdentity("trigger7", "group1")
.withSchedule(simpleSchedule()
.withIntervalInMinutes(5)
.repeatForever())
.endAt(dateOf(22, 0, 0))
.build();
建立一个触发器,将在下一个小时的整点触发,然后每2小时重复一次:
trigger = newTrigger().withIdentity("trigger8") // 由于未指定组,因此“ trigger8”将位于默认组中
.startAt(evenHourDate(null)) // 得到下一个偶数小时(分钟和秒为零(“ 00:00”))
.withSchedule(simpleSchedule()
.withIntervalInHours(2)
.repeatForever())// 请注意,在此示例中,没有调用“ forJob(..)”,这是有效的
// 如果触发器与作业一起传递给调度程序
.build();
scheduler.scheduleJob(trigger, job);
TriggerBuilder(以及Quartz的其它builder)会为那些没有被显式设置的属性选择合理的默认值。比如:如果你没有调用withIdentity(..)方法,TriggerBuilder会为trigger生成一个随机的名称;如果没有调用startAt(..)方法,则默认使用当前时间,即trigger立即生效。
利用datebuilder方法
Date startTime = DateBuilder.nextGivenSecondDate(null, 8);
SimpleTrigger trigger = (SimpleTrigger) newTrigger()
.withIdentity("trigger1", "group1")
.startAt(startTime) //设置开始时间是每隔8秒开始,没有设置次数,使用默认值
.build();
System.out.printf("%s 这个任务会在 %s 准时开始运行,累计运行%d次,间隔时间是%d毫秒%n", job.getKey(), ft.toLocaleString(), trigger.getRepeatCount()+1, trigger.getRepeatInterval());
10 秒后运行
使用方法:
可以方便的获取10秒后, 5分钟后, 3个小时候,2个月后这样的时间
Date startTime = DateBuilder.futureDate(10, DateBuilder.IntervalUnit.SECOND);//10秒后运行
SimpleTrigger trigger = (SimpleTrigger) newTrigger()
.withIdentity("trigger1", "group1")
.startAt(startTime)
.build();
累计n次,间隔n秒
Date startTime = DateBuilder.nextGivenSecondDate(null, 8);
SimpleTrigger trigger = (SimpleTrigger) newTrigger()
.withIdentity("trigger1", "group1")
.startAt(startTime) //设置开始时间是每隔8秒开始
.withSchedule(simpleSchedule()
.withRepeatCount(3) //重复4次
.withIntervalInSeconds(1))//1秒间隔一次
.build();
System.out.printf("%s 这个任务会在 %s 准时开始运行,累计运行%d次,间隔时间是%d毫秒%n", job.getKey(), ft.toLocaleString(), trigger.getRepeatCount()+1, trigger.getRepeatInterval());
明天计划的事情:(一定要写非常细致的内容)
遇到的问题:(遇到什么困难,怎么解决的)
收获:(通过今天的学习,学到了什么知识)
简单学习了simpletrigger。会写简单的定时任务。
评论