Quartz定时任务框架

1、简介

quartz是一个执行定时任务的一个java框架。

2、cronExpression规则

quartz有一套自己的时间表达式,用于设定定时任务的触发时间。
其格式为:秒 分 时 日 月 周 年,其中年为选填,日和周不能同时使用,即有一个为”?”。
例:0 0 0 * * ?,解读后的意思是每天的0时0分0秒,即每天的零点。

时间 范围 可使用特殊符号
0-59 , - * /
0-59 , - * /
0-23 , - * /
1-31 , - * ? / L W C
1-12或JAN-DEC , - * /
1-7或SUN-SAT(1对应周日、2对应周一。。。7对应周六) , - * ? / L C #
年(可选) 1970-2099 , - * /

特殊符号 说明
* 指整个时段,即每一秒、每一分钟、每一小时
- 指区间范围,例”小时”字段为”10-12”,即10点~12点间
, 指数个值,例”周”字段为”MON,WEB,FRI”,即周一、周三、周五
/ 指”每“,例”0/15“,即从0开始,每15执行一次
L 用于日、周,表示每月最后一天或者每月最后的周几。例”周”字段为”6L”表示每月最后一个周五
W 最近的一个工作日,如“15w”为本月15号最近的一个工作日
# 每月第n周的周n,例“6#3”或“FRI#3”表示每月的第三个周五

3、Quartz简单使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
//此处为需要定时执行的任务
}
}
public class QuartzManager {
public static void addJob(String jobName, Class<? extends Job> jobClass,
String cronExpression) throws Exception {
Scheduler sched = new StdSchedulerFactory().getScheduler();
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName).build();
Trigger trigger = TriggerBuilder.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
.startNow().build();
sched.scheduleJob(jobDetail, trigger);
sched.start();
}

public static void main(String[] args) {
//每天零点执行定时任务
String cronExpression="0 0 0 * * ?";
//参数分别是:任务名,任务类,cronExpression
addJob("myjob", MyJob.class, cronExpression);
}
}

4、Spring整合

applicationContext.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- 1、定制任务信息 -->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 设置执行对象 -->
<property name="targetObject" ref="作业的bean"/>
<!-- 设置执行对象中对应的执行方法 -->
<property name="targetMehtod" value="方法名"/>
<!-- 是否可以同步执行 -->
<property name="concurrent" value="false"/>
</bean>

<!-- 2、制定任务执行时机(执行任务触发器) -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail"/>
<property name="cronExpression" value="cronExpression表达式"/>
</bean>

<!-- 3、设置调度工厂 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
</list>
</property>
</bean>

5、任务线程池

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
public class ScheduledThreadPoolConfig implements SchedulingConfigurer {

@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}

@Bean(name="taskExecutor",destroyMethod="shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(20);
}

}