赞
踩
目录
后台项目开发中经常会用到定时任务,现在实现定时任务都方式也是多种多样。下面列举几种常见的定时任务实现方式:
1. Quartz:Quartz的使用相当广泛,它是一个功能强大的调度器,当然使用起来也相对麻烦;
2. java.util包里的Timer,它也可以实现定时任务但是功能过于单一所有使用很少。
3. 今天要介绍的是Spring自带的定时任务Schedule,其实可以把它看作是一个简化版的,轻量级的Quartz,使用起来也相对方便很多。
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.scheduling.annotation.Scheduled;
- import org.springframework.stereotype.Component;
-
- /**
- * Description: 构建执行定时任务
- * Designer: jack
- * Date: 2017/8/10
- * Version: 1.0.0
- */
- @Component
- public class ScheduledTasks {
-
- private Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);
-
- private int fixedDelayCount = 1;
- private int fixedRateCount = 1;
- private int initialDelayCount = 1;
- private int cronCount = 1;
-
- @Scheduled(fixedDelay = 5000) //fixedDelay = 5000表示当前方法执行完毕5000ms后,Spring scheduling会再次调用该方法
- public void testFixDelay() {
- logger.info("===fixedDelay: 第{}次执行方法", fixedDelayCount++);
- }
-
- @Scheduled(fixedRate = 5000) //fixedRate = 5000表示当前方法开始执行5000ms后,Spring scheduling会再次调用该方法
- public void testFixedRate() {
- logger.info("===fixedRate: 第{}次执行方法", fixedRateCount++);
- }
-
- @Scheduled(initialDelay = 1000, fixedRate = 5000) //initialDelay = 1000表示延迟1000ms执行第一次任务
- public void testInitialDelay() {
- logger.info("===initialDelay: 第{}次执行方法", initialDelayCount++);
- }
-
- @Scheduled(cron = "0 0/1 * * * ?") //cron接受cron表达式,根据cron表达式确定定时规则
- public void testCron() {
- logger.info("===initialDelay: 第{}次执行方法", cronCount++);
- }
-
- }

使用@Scheduled来创建定时任务 这个注解用来标注一个定时任务方法。通过看@Scheduled源码可以看出它支持多种参数:
(1)cron:cron表达式,指定任务在特定时间执行;
(2)fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms;
(3)fixedDelayString:与fixedDelay含义一样,只是参数类型变为String;
(4)fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms;
(5)fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String;
(6)initialDelay:表示延迟多久再第一次执行任务,参数类型为long,单位ms;
(7)initialDelayString:与initialDelay的含义一样,只是将参数类型变为String;
(8)zone:时区,默认为当前时区,一般没有用到。
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.scheduling.annotation.EnableScheduling;
-
- /**
- * Description: 启动类
- * Designer: jack
- * Date: 2017/8/10
- * Version: 1.0.0
- */
- @SpringBootApplication
- @EnableScheduling
- public class Application {
- public static void main(String[] args) {
- SpringApplication.run(Application.class, args);
- }
- }

注意这里的 @EnableScheduling 注解,它的作用是发现注解@Scheduled的任务并由后台执行。没有它的话将无法执行定时任务
到此我们就完成了一个简单的定时任务模型,下面执行springBoot观察执行结果。
- 2017-08-11 12:06:19.738 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===initialDelay: 第1次执行方法
- 2017-08-11 12:06:23.739 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===fixedRate: 第2次执行方法
- 2017-08-11 12:06:23.739 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===fixedDelay: 第2次执行方法
- 2017-08-11 12:06:24.738 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===initialDelay: 第2次执行方法
- 2017-08-11 12:06:28.739 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===fixedRate: 第3次执行方法
- 2017-08-11 12:06:28.740 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===fixedDelay: 第3次执行方法
- 2017-08-11 12:06:29.739 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===initialDelay: 第3次执行方法
- 2017-08-11 12:06:33.735 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===fixedRate: 第4次执行方法
- 2017-08-11 12:06:33.741 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===fixedDelay: 第4次执行方法
- 2017-08-11 12:06:34.738 INFO 52252 --- [pool-1-thread-1] com.test.ScheduledTasks : ===initialDelay: 第4次执行方法
从控制台输入的结果中我们可以看出所有的定时任务都是在同一个线程池用同一个线程来处理的,那么我们如何来并发的处理各定时任务呢?⬇⬇⬇⬇
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。