SpringBoot三种方式实现定时任务
定时任务实现的三种方式:

Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。

ScheduledExecutorService:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。

Spring Task:Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。

使用Timer

这个目前在项目中用的较少,直接贴demo代码。具体的介绍可以查看api

public class TestTimer {public static void main(String[] args) {TimerTask timerTask = new TimerTask() {@Overridepublic void run() {System.out.println("task  run:"+ new Date());}};Timer timer = new Timer();//安排指定的任务在指定的时间开始进行重复的固定延迟执行。这里是每3秒执行一次timer.schedule(timerTask,10,3000);}
}

使用ScheduledExecutorService

该方法跟Timer类似,直接看demo:

public class TestScheduledExecutorService {public static void main(String[] args) {ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();// 参数:1、任务体 2、首次执行的延时时间//      3、任务执行间隔 4、间隔时间单位service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);}
}

使用Spring Task

1,简单的定时任务
在SpringBoot项目中,我们可以很优雅的使用注解来实现定时任务,首先创建项目,导入依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

创建任务类:

@Slf4j
@Component
public class ScheduledService {@Scheduled(cron = "0/5 * * * * *")public void scheduled(){log.info("=====>>>>>使用cron  {}",System.currentTimeMillis());}@Scheduled(fixedRate = 5000)public void scheduled1() {log.info("=====>>>>>使用fixedRate{}", System.currentTimeMillis());}@Scheduled(fixedDelay = 5000)public void scheduled2() {log.info("=====>>>>>fixedDelay{}",System.currentTimeMillis());}
}

在主类上使用@EnableScheduling注解开启对定时任务的支持,然后启动项目
可以看到三个定时任务都已经执行,并且使同一个线程中串行执行,如果只有一个定时任务,这样做肯定没问题,当定时任务增多,如果一个任务卡死,会导致其他任务也无法执行。

2,多线程执行
在传统的Spring项目中,我们可以在xml配置文件添加task的配置,而在SpringBoot项目中一般使用config配置类的方式添加配置,所以新建一个AsyncConfig类

@Configuration
@EnableAsync
public class AsyncConfig {/*此处成员变量应该使用@Value从配置中读取*/private int corePoolSize = 10;private int maxPoolSize = 200;private int queueCapacity = 10;@Beanpublic Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(corePoolSize);executor.setMaxPoolSize(maxPoolSize);executor.setQueueCapacity(queueCapacity);executor.initialize();return executor;}
}

@Configuration:表明该类是一个配置类
@EnableAsync:开启异步事件的支持

然后在定时任务的类或者方法上添加@Async 。最后重启项目,每一个任务都是在不同的线程中。

在线cron表达式生成:http://qqe2.com/cron/index

喜欢本文的朋友们,欢迎关注微信公众号“Java面试达人”,收看更多精彩内容

SpringBoot三种方式实现定时任务相关推荐

  1. SpringBoot实现定时任务的三种方式

    第一种我们可以使用java原生提供的api去实现一个定时任务 利用Timer这个api,去实现定时任务,用Timertask去创建一个任务 public class javaJob {public s ...

  2. SpringBoot静态获取 bean的三种方式,你学会了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/showchi/article/details/97005720 注意:调用者要被spring管理 ...

  3. python实现定时任务的方式_Python实现定时执行任务的三种方式简单示例

    本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 #!/user/bin/env python # @Time :2018/6/7 16:31 ...

  4. Springboot实现登录拦截的三种方式

    文章目录 1. 登录认证 1.1 介绍 1.2 方式 1.3 扩展 2. 实现 2.1 项目结构以及前置准备 2.2 过滤器实现登录拦截 2.3 拦截器实现登录拦截 2.4 AOP+自定义注解实现 2 ...

  5. Springboot单元测试mysql_Springboot Mybatis-Plus数据库单元测试实战(三种方式)

    单元测试长久以来是热门话题,本文不会讨论需不需要写单测,可以看看参考资料1,我个人认为写好单测应该是每个优秀开发者必备的技能,关于写单测的好处在这里我就不展开讨论了,快速进入本文着重讨论的话题,如何写 ...

  6. 【Linux】部署Springboot项目到Linux服务器以及linux服务器下载文件的三种方式详解

    Linux学习之路 初识Linux Linux内核 由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写 Linux 是一套免费使用和自由传播的类Unix操作系 ...

  7. springboot:java实现邮件及附件发送、HTML正文的三种方式(一)【附带源码】

    0. 引言 邮件发送是我们日常开发中比较常见的功能,常用于预警信息提醒.统计数据定期发送等需求.一般该方法会由前人封装好,实际开发时只需要调用即可,但具体怎么实现的,如何从零实现邮件发送,这是我们要掌 ...

  8. SpringBoot 三种拦截http请求方式Filter,interceptor和aop

    SpringBoot 三种拦截http请求方式Filter,interceptor和aop. 这三种拦截方式的拦截顺序是:filter->Interceptor-->ControllerA ...

  9. 【小家Spring】SpringBoot中使用Servlet、Filter、Listener三大组件的三种方式以及原理剖析

    每篇一句 要么就安逸的穷,要么就拼命的干 前提概要 web开发使用Controller基本能解决大部分的需求,但是有时候我们也需要使用Servlet,因为相对于拦截和监听来说,有时候原生的还是比较好用 ...

最新文章

  1. 执行远程linux命令,linux shell 远程执行命令
  2. QIIME 2用户文档. 11元数据Metadata(2019.7)
  3. 中层管理者,你到底怎样管理?
  4. 2019 半导体领袖新年展望(一)| 半导体行业观察
  5. c语言清除html标签的方法,去除HTML代码中所有标签的两种方法
  6. python vscode_VScode 配置为Python编辑器
  7. 70. 爬楼梯 golang 斐波那契数列
  8. 【恋上数据结构】串匹配算法(蛮力匹配、KMP【重点】、Boyer-Moore、Karp-Rabin、Sunday)
  9. 也写Jquery插件,拖动布局
  10. 2021-07-07 https://github.com/pasu/ExamplesforCesium/wiki
  11. java剪刀石头布游戏心得体会,基于JAVA的剪刀石头布游戏设计——Java课程设计报告_...
  12. 人工神经网络分析方法,神经网络数据分析步骤
  13. 计算机表格制作培训教材,电脑制作表格教案设计
  14. 删除安卓7.1源码中自带的Japanese IME输入法
  15. movieclip_Flash脚本-在Flash中更改Movieclip的颜色
  16. NOIP2010导弹拦截
  17. python定义变量不赋值_python定义变量
  18. 输出二叉树中从每个叶子结点到根结点的路径
  19. python生成10个随机密码_python题:随机密码生成。编写程序,在26个字母大小写和9个数字组成的列表中随机生成10个8位密码...
  20. AJAX框架简笔画图片教程,jquery 框架使用教程 AJAX篇

热门文章

  1. C语言fopen函数的用法
  2. sqlsever的安装及使用
  3. 精雕软件怎么把图片转成灰度图_bmp灰度图怎么转精雕浮雕图和做刀路?
  4. Android地图显示百万数量的图标Demo
  5. python文件式和交互式道路标志_其它课程中的python---4、Matplotlib最最最最简单使用...
  6. 厂用电继电保护整定计算导则 DL/T 1502 - 2016
  7. AcWing 1143. 联络员
  8. 微服务架构(一):什么是微服务(一)
  9. 发布Jar到中央仓库报错 Remote staging failed: Staging rules failure!
  10. 到底发生了什么,让你刚入职就想离职?