Java之定时任务全家桶
定时任务应用非常广泛,Java提供的现有解决方案有很多。
本次主要讲schedule、quartz、xxl-job、shedlock等相关的代码实践。
一、SpringBoot使用Schedule
核心代码:
1 | @Component | 
运行效果如下:

除此之外还可以这样实现,核心代码:
1 | @PropertySource(value = { | 
有朋友或许很疑惑,为什么要写这么一大堆,这个与前面的代码又有何区别呢?
区别是多线程并行。其实多线程并行也可以不用这么写,只需写一段核心配置类代码即可。
定时任务多线程配置类:
1 | @Configuration | 
再次启动,查看效果,如下:

由此看出走不同的线程执行,不同的线程执行的好处是,如果某一个线程挂掉后,并不会阻塞导致其它定时任务无法执行。
另外如果要想并发执行,前面的配置可以不要,直接用SpringBoot提供的现成注解即可,核心代码如下:
1 | @Component | 
除此外,还有基于schedule动态定时任务(所谓动态只不过是指cron表达式放在对应的数据表里),简单示例代码:
1 | @Configuration | 
核心配置文件(application.yml):
1 | spring: | 
SQL脚本:
1 | DROP DATABASE IF EXISTS `test`; | 
运行效果如下:

二、SpringBoot使用Quartz
1.Maven依赖
1 |  | 
2.配置文件
1 | spring: | 
3.启动类
1 | @SpringBootApplication | 
4.配置类
1 | @Configuration | 
5.定时任务类
1 | public class CouponTimeOutJob extends QuartzJobBean { | 
6.启动成功不报错
(1)对应的数据库会生成定时任务相关的数据表

(2)控制台不断输出定时任务执行日志

三、SpringBoot使用xxl-job
之前写过一样的例子,如今简化了下。
关于xxl-job使用详情,可以参考我的这篇文章:
SpringBoot整合Xxl-Job
1.Maven依赖
1 |  | 
2.配置类
1 | @Configuration | 
3.配置文件内容
1 | # web port | 
4.定时任务类
1 | @Component | 
5.执行效果
分别如下所示:


四、SpringBoot使用ShedLock
1.导入Maven依赖
1 |  | 
2.编写配置类
1 | @Configuration | 
3.编写具体的定时任务
1 | @Component | 
4.编写启动类
1 | @SpringBootApplication | 
5.配置文件
1 | server: | 
6.测试
我之所以用shedlock是因为确保在集群环境下各微服务的定时任务只执行一个,而不是全部都运行相同的定时任务。
本次测试效果如下:

本次代码例子已放至我的GitHub:
https://github.com/developers-youcong/blog-job
source: https://developers-youcong.github.io/2020/11/21/Java之定时任务全家桶/
喜欢,在看
评论
