作者:中国移动云能力中心——孙波
概要:本文主要介绍了开源定时任务框架Quartz,以及在云安全定时推送任务中的使用。Java 系统中主要有三种方式来实现定时任务:1、Timer和TimerTask;2、ScheduledExecutorService;3、三方框架 Quartz。其中,Quartz 是一个功能完善的任务调度框架,支持集群环境下的任务调度,需要将任务调度状态序列化到数据库,是企业级定时任务调度框架中的不二选择。
一、Quartz介绍
quartz 基本概念
Job 表示一个工作,要执行的具体内容。此接口中只有一个方法,如下:
void execute(JobExecutionContext context)
Scheduler(调度器) 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了。
JobDetail 表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。
Trigger(触发器) 代表一个调度参数的配置,什么时候去调用。
quartz所用到的设计模式
Builder模式 Factory模式 组件模式 链式写法
quartz特点
(1)强大的调度功能:作为spring默认的调度框架,很容易与spring集成,实现灵活可配置的调度功能;还提供了调度运行环境的持久化机制,可以保存并恢复调度现场,即使系统因故障关闭,任务调度现场数据并不会丢失。 (2)灵活的应用方式:允许开发者灵活的定义触发器的调度时间表并可以为触发器和任务进行关联映射。 (3)分布式和集群能力
二、一个Quartz程序Demo
主函数
public class ScheduleGo {
public static void main(String[] args) throws SchedulerException {
Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler();
JobDetail job1 = JobBuilder.newJob(MyJob.class)
.usingJobData("message", "打印日志")
.withIdentity("job1").build();
Trigger trigger1 = TriggerBuilder.newTrigger()
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).withRepeatCount(5))
.usingJobData("message", "触发器")
.withIdentity("trigger1").build();
defaultScheduler.scheduleJob(job1, trigger1);
defaultScheduler.start();
}
}
定时任务
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
*/
public class MyJob implements Job {
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("当前时间......" + DateTime.now());
}
}
三、Quartz源码浅析
Trigger
SimpleTrigger
SimpleTrigger可以满足的调度需求是:在具体的时间点执行一次,或者在具体的时间点执行,并且以指定的间隔重复执行若干次。比如,你有一个trigger,你可以设置它在2020年1月13日的上午11:23:54准时触发,或者在这个时间点触发,并且每隔2秒触发一次,一共重复5次。SimpleTrigger的属性包括:开始时间、结束时间、重复次数以及重复的间隔。源码如下:

CronTrigger
CronTrigger通常比Simple Trigger更有用,如果您需要基于日历的概念而不是按照SimpleTrigger的精确指定间隔进行重新启动的作业启动计划。使用CronTrigger,您可以指定号时间表,例如“每周五中午”或“每个工作日和上午9:30”,甚至“每周一至周五上午9:00至10点之间每5分钟”和1月份的星期五“。和SimpleTrigger一样,CronTrigger有一个startTime,它指定何时生效,以及一个(可选的)endTime,用于指定何时停止计划。源码如下:

Cron-Expressions用于配置CronTrigger的实例。Cron Expressions是由七个子表达式组成的字符串,用于描述日程表的各个细节。这些子表达式用空格分隔,并表示:
- Seconds
- Minutes
- Hours
- Day-of-Month
- Month
- Day-of-Week
- Year (optional field)
一个完整的Cron-Expressions的例子是字符串“0 0 12?* WED“ - 这意味着”每个星期三下午12:00“。
CronTrigger代码示例
任务将在每周五上午10点触发
trigger = newTrigger()
.withIdentity("trigger3", "group1")
.withSchedule(cronSchedule("0 0 10 ? * FRI *"))
.forJob("myJob", "group1")
.build()
四、Quartz在云安全业务中的应用
quartz在云安全业务中主要用于定时推送任务,如容量管理,用户邮件提醒,订购信息推送等。本文以容量管理为例。
在云安全业务中,通常需要对安全产品的可售额和已售额进行监控。云安全产品采用定时上报给BC-OPS平台的形式进行数据监控。
定时任务分为定时刷新任务和定时推送任务,定时刷新任务与11个数据库表相对应,通过quartz.properties中org.quartz.jobStore.tablePrefix值来配置。

最后一张表用于存储从定时推送任务表中获取的任务信息,每隔10分钟从表os_biz_sec_user_notice_config中获取定时推送任务参数。
表os_biz_sec_user_notice_config结构如下:

CRON字段用于存储任务执行的表达式,如'0 0/30 * * * ?',每隔半小时执行一次推送任务。以态势感知为例,定时任务日志如下:

版权声明 (原创):本文内容由移动云用户自发贡献,版权归原作者所有,移动云开发者社区不拥有其著作权,亦不承担相应法律责任。如果您发现本社区有涉嫌抄袭的内容,可填写举报信息,一经查实,本社区将立刻删除涉嫌侵权内容。
本文深入解读开源定时任务框架Quartz,阐述其Job、Scheduler和Trigger概念,提供了一个实战Demo,重点介绍了在云安全业务中的容量管理定时推送应用,展示了CronTrigger的使用和Quartz在云安全任务调度中的关键作用。
3511

被折叠的 条评论
为什么被折叠?



