概述
基本概念
定义:任务调度开源框架
任务调度:
在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情。
- 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作。
- 任务调度涉及多线程并发,线程池维护,运行时间规则解析,运行现场的保护以恢复等方面。
Quartz框架是一个开源的企业级任务调度服务,已经被作为任务调度的良好解决方案。
Quartz对任务调度进行了高度抽象,提出了3个核心概念,并在org.quartz包中通过接口和类进行了描述
任务:就是执行的工作内容。Quartz提供Job接口来支持任务定义
触发器:定义触发Job执行的时间触发规则。Quartz提供Trigger类及其子类支持触发器功能
调度器:Quartz提供了Scheduler接口,将工作任务和触发器绑定,保证任务可以在正确的时间执行
实例:
1.导入坐标依赖:
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.3</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
2.创建实现Job的实现类:
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("TriggerName:"+jobExecutionContext.getTrigger().getName());
System.out.println("TriggerTime:"+new Date());
System.out.println("JobName:"+jobExecutionContext.getJobDetail().getName());
System.out.println("妈妈喊你回家吃饭");
}
}
3.具体开启任务调度:
//TODO:任务
try {
//1.定义任务对象
JobDetail job = new JobDetail("task1","miaoGroup", MyJob.class);
//2.创建SimpleTrigger触发器(间隔触发)
SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1", "miaoTrigger",SimpleTrigger.REPEAT_INDEFINITELY,3000);
//2.创建CronTrigger触发器(特定触发)
CronTrigger cronTrigger = new CronTrigger("trigger1","miaoTrigger","0 58 10 ? * *");
//3.创建调度器
SchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
scheduler.scheduleJob(job,simpleTrigger);
//4.启动调度器
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
SimpleTrigger: 定义间隔时间节点触发
CronTrigger: 定义特定时间节点触发
Cron表达式:由6~7个由空格分隔的时间元素组成。第7个元素可选。
位置 | 字段含义 | 范围 | 允许的特殊字符 |
1 | 秒 | 0~59 | *_/ |
2 | 分钟 | 0~59 | *_/ |
3 | 小时 | 0~23 | *_/ |
4 | 月份中哪一天 | 1~31 | *_/?L |
5 | 月份 | 1~12或JAN~DEC | *_/ |
6 | 星期几 | 1~7或SUN~SAT | * / ? L # |
7 | 年份 | 1970~2099 | * / |
Cron表达式每个字段,都可以显式的规定一个值(如49),一个范围(1-6),一个列表(1,3,5)或者一个通配符(如*)
Cron表达式有几个特殊的字符,说明如下:
“-”:中划线,表示一个范围
“,”:使用逗号间隔的数据,表示一个列表
“*”:表示每一个值,它可以用于所有字段。例:在小时字段表示每小时
"?":该字符仅用于“月份中的哪一天”字段和“星期几”字段,表示不指定值
“/”:通常表示为x/y,x为起始值,y表示值的增长
“L”:表示最后一天,仅在日期和星期字段中使用
“#“:只能用于”星期几“字段,表示这个月的第几个周几。例:”6#3“指这个月第三个周五
排除时间规则
可以使用Quartz提供的Calendar接口来实现,且Quartz提供了多种实现类来满足应用的需求
Calendar名称 | 作用 |
WeeklyCalendar | 用于排除星期中的一天或多天 |
MonthlyCalendar | 用于排除月份中的数天 |
AnnualCalendar | 用于排除年中的一天或多天 |
HolidayCalendar | 用于排除节假日 |
注:Calendar接口是quartz提供的,并非jdk中java.util包下的月历类
例:排除每周一的第一天
//TODO:任务
try {
//1.定义任务对象
JobDetail job = new JobDetail("task1","miaoGroup", MyJob.class);
//2.创建SimpleTrigger触发器(间隔触发)
//
SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1", "miaoTrigger",SimpleTrigger.REPEAT_INDEFINITELY,3000);
//2.创建CronTrigger触发器(特定触发)
CronTrigger cronTrigger = new CronTrigger("trigger1","miaoTrigger","0 32 11 ? * * ");
//2.1排除
AnnualCalendar annualCalendar = new AnnualCalendar();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MONTH,1);
calendar.set(Calendar.DATE,1);
annualCalendar.setDayExcluded(calendar,true);
//3.创建调度器
SchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
scheduler.scheduleJob(job,cronTrigger);
scheduler.addCalendar("exclued",annualCalendar,true,true);
//4.启动调度器
scheduler.start();
} catch (Exception e) {
e.printStackTrace();
}
最后
以上就是眼睛大绿茶为你收集整理的Quartz(石英框架)理论基本概念的全部内容,希望文章能够帮你解决Quartz(石英框架)理论基本概念所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复