Lmxy1990 ' Blog

定时任务调度

定时任务使用的方法

1.最原始的使用java提供的延迟循环队列.
2.使用Quartz提供的方法.
3.使用spring提供的调度器.

使用循环延迟队列.

1
2
3
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(10);
//启动延迟,初始化延迟,多久执行一次.
executorService.scheduleWithFixedDelay(new Runable(), 0, 9, TimeUnit.HOURS);

使用Quartz调度

1.引入依赖或者Jar包

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>

2.配置执行参数

1
2
3
4
5
6
7
8
<!--配置启动的bean,task以及执行的方法-->
<bean id="job" class=" xx.xx.xx.Job" />
<bean id="cronTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="job" />
<property name="targetMethod" value="runWork" />
<!-- false表示job不会并发执行,默认为true-->
<property name="concurrent" value="false" />
</bean>

2.接下来配置触发器

1
2
3
4
5
<bean id="doWork" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="cronTask" />
<!—每天凌晨0点1分执行-->
<property name="cronExpression" value="0 01 00 * * ?" />
</bean>

3.最后配置调度工厂

1
2
3
4
5
6
7
8
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<!--调度多个任务-->
<ref local="doWork"/>
</list>
</property>
</bean>

使用spring task来调度

1.添加相应的命名空间

1
2
3
4
5
6
<beans xmlns="http://www.springframework.org/schema/beans" 
......
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
......
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">

2.task 线程池配置

1
2
3
<task:executor id="executor" pool-size="5" />
<task:scheduler id="scheduler" pool-size="5" />
<task:annotation-driven executor="executor" scheduler="scheduler" />

3.task配置,以及调度时间配置

1
2
3
4
<bean name = "myTask" class = "xxx.xxx.MyTask" />
<task:scheduled-tasks scheduler="reportTaskScheduler" >
<task:scheduled ref="myTask" method="doTask" cron="0/5 * * * * ?" />
</task:scheduled-tasks>

总结

1.方法一如果要采用Spring来启动的话.就需要实现Spring的初始化Bean的接口(InitializingBean).在初始化之后,调用该任务的延迟队列.
2.Quartz与Spring的 Task的区别是一个可以异步,一个只能同步.
3.Spring 与Quartz的时间配置都是采用cron表达式.

附录Cron表达式

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
26
“0/10 * * * * ?” 每10秒触发 
“0 0 12 * * ?” 每天中午12点触发
“0 15 10 ? * *” 每天上午10:15触发
“0 15 10 * * ?” 每天上午10:15触发
“0 15 10 * * ? *” 每天上午10:15触发
“0 15 10 * * ? 2005” 2005年的每天上午10:15触发
“0 * 14 * * ?” 在每天下午2点到下午2:59期间的每1分钟触发
“0 0/5 14 * * ?” 在每天下午2点到下午2:55期间的每5分钟触发
“0 0/5 14,18 * * ?” 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
“0 0-5 14 * * ?” 在每天下午2点到下午2:05期间的每1分钟触发
“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触发
每隔5秒执行一次:/5 * * * ?
每隔1分钟执行一次:0 /1 * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?

End

坚持原创技术分享,您的支持将鼓励我继续创作!