Java定时任务汇总
1. 概述
2. 快速入门 Spring Task
3. 快速入门 Quartz 单机
4. 再次入门 Quartz 集群
5. 快速入门 XXL-JOB
6. 快速入门 Elastic-Job
完整代码示例: https://github.com/YunaiV/SpringBoot-Labs 的 lab-28 目录。
转自 : http://www.iocoder.cn/Spring-Boot/Job/
1. 概述
在产品的色彩斑斓的黑的需求中,有存在一类需求,是需要去定时执行的,此时就需要使用到定时任务。例如说,每分钟扫描超时支付的订单,每小时清理一次日志文件,每天统计前一天的数据并生成报表,每个月月初的工资单的推送,每年一次的生日提醒等等。
其中,最喜欢“每个月月初的工资单的推送”,你呢?
在 JDK 中,内置了两个类,可以实现定时任务的功能:
java.util.Timer
:可以通过创建java.util.TimerTask
调度任务,在同一个线程中串行执行,相互影响。也就是说,对于同一个 Timer 里的多个 TimerTask 任务,如果一个 TimerTask 任务在执行中,其它 TimerTask 即使到达执行的时间,也只能排队等待。因为 Timer 是串行的,同时存在 坑坑 ,所以后来 JDK 又推出了 ScheduledExecutorService ,Timer 也基本不再使用。java.util.concurrent.ScheduledExecutorService
:在 JDK 1.5 新增,基于线程池设计的定时任务类,每个调度任务都会被分配到线程池中并发执行,互不影响。这样,ScheduledExecutorService 就解决了 Timer 串行的问题。
在日常开发中,我们很少直接使用 Timer 或 ScheduledExecutorService 来实现定时任务的需求。主要有几点原因:
它们仅支持按照指定频率,不直接支持指定时间的定时调度,需要我们结合 Calendar 自行计算,才能实现复杂时间的调度。例如说,每天、每周五、2019-11-11 等等。
它们是进程级别,而我们为了实现定时任务的高可用,需要部署多个进程。此时需要等多考虑,多个进程下,同一个任务在相同时刻,不能重复执行。
项目可能存在定时任务较多,需要统一的管理,此时不得不进行二次封装。
所以,一般情况下,我们会选择专业的调度任务中间件。
关于“任务”的叫法,也有叫“作业”的。在英文上,有 Task 也有 Job 。本质是一样的,本文两种都会用。
然后,一般来说是调度任务,定时执行。所以胖友会在本文,或者其它文章中,会看到“调度”或“定时”的字眼儿。
在 Spring 体系中,内置了两种定时任务的解决方案:
第一种,Spring Framework 的 Spring Task 模块,提供了轻量级的定时任务的实现。
第二种,Spring Boot 2.0 版本,整合了 Quartz 作业调度框架,提供了功能强大的定时任务的实现。
注:Spring Framework 已经内置了 Quartz 的整合。Spring Boot 1.X 版本未提供 Quartz 的自动化配置,而 2.X 版本提供了支持。
在 Java 生态中,还有非常多优秀的开源的调度任务中间件:
Elastic-Job
唯品会基于 Elastic-Job 之上,演化出了 Saturn 项目。
Apache DolphinScheduler
XXL-JOB
目前国内采用 Elastic-Job 和 XXL-JOB 为主。从了解到的情况,使用 XXL-JOB 的团队会更多一些,主要是上手较为容易,运维功能更为完善。
本文,我们会按照 Spring Task、Quartz、XXL-JOB 的顺序,进行分别入门。而在文章的结尾,会简单聊聊分布式定时任务的实现原理。
2. 快速入门 Spring Task
示例代码对应仓库:lab-28-task-demo 。
考虑到实际场景下,我们很少使用 Spring Task ,所以本小节会写的比较简洁。如果对 Spring Task 比较感兴趣的胖友,可以自己去阅读 《Spring Framework Documentation —— Task Execution and Scheduling》 文档,里面有 Spring Task 相关的详细文档。
在本小节,我们会使用 Spring Task 功能,实现一个每 2 秒打印一行执行日志的定时任务。
2.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.1.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><modelVersion>4.0.0</modelVersion><artifactId>lab-28-task-demo</artifactId><dependencies><!-- 实现对 Spring MVC 的自动化配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>
因为 Spring Task 是 Spring Framework 的模块,所以在我们引入 spring-boot-starter-web
依赖后,无需特别引入它。
同时,考虑到我们希望让项目启动时,不自动结束 JVM 进程,所以我们引入了 spring-boot-starter-web
依赖。
2.2 ScheduleConfiguration
在 cn.iocoder.springboot.lab28.task.config
包路径下,创建 ScheduleConfiguration 类,配置 Spring Task 。代码如下:
// ScheduleConfiguration.java@Configuration
@EnableScheduling
public class ScheduleConfiguration {
}
在类上,添加
@EnableScheduling
注解,启动 Spring Task 的定时任务调度的功能。
2.3 DemoJob
在 cn.iocoder.springboot.lab28.task.job
包路径下,创建 DemoJob 类,示例定时任务类。代码如下:
// DemoJob.java@Component
public class DemoJob {private Logger logger = LoggerFactory.getLogger(getClass());private final AtomicInteger counts = new AtomicInteger();@Scheduled(fixedRate = 2000)public void execute() {logger.info("[execute][定时第 ({}) 次执行]", counts.incrementAndGet());}}
在类上,添加
@Component
注解,创建 DemoJob Bean 对象。创建
#execute()
方法,实现打印日志。同时,在该方法上,添加@Scheduled
注解,设置每 2 秒执行该方法。
虽然说,@Scheduled
注解,可以添加在一个类上的多个方法上,但是个人习惯上,还是一个 Job 类,一个定时任务。
Java定时任务汇总相关推荐
- Java知识汇总-思维导图
2019独角兽企业重金招聘Python工程师标准>>> Java知识点汇总,从基础到常用的API.还有常用的集合类,总结的很详细.图片是从论坛里面找到的,整理下来以便常复习.这是目前 ...
- java定时任务,每天定时执行任务
java定时任务,每天定时执行任务.以下是这个例子的全部代码. public class TimerManager {//时间间隔private static final long PERIOD_DA ...
- java定时任务框架elasticjob详解
这篇文章主要介绍了java定时任务框架elasticjob详解,Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.该项目基于成熟的开源产品Quartz和Zo ...
- Springboot2 Quartz实现JAVA定时任务的动态配置
动态配置Quartz.没接触过定时任务的同学可以先看下此篇:JAVA定时任务实现的几种方式 文章目录 一.需求背景 1. 问题现象 2. 问题分析 3. 解决方案 二.需求背景 2.1. maven依 ...
- Java定时任务解决方案
Java定时任务解决方案 参考文章: (1)Java定时任务解决方案 (2)https://www.cnblogs.com/zhixiang-org-cn/p/9490877.html (3)http ...
- Java知识点汇总以及常见面试题
Java知识点汇总以及常见面试题 1. "=="和equals()的区别 2. 构造方法能不能重写或者重载 3. 基本数据类型 4. 匿名内部类能被继承? 5. Integer和i ...
- Java定时任务(一) Timer及TimerTask的案例解析及源码分析
Java定时任务(一) Timer及TimerTask的案例解析及源码分析 一.概述: 定时任务这个概念在Java的学习以及项目的开发中并不陌生,应用场景也是多种多样.比如我们会注意到12306网站 ...
- JAVA定时任务的简单实现
Java定时任务的简单实现 2011-01-02 18:34:43| 分类: 软件开发 | 标签:void timer import param dateutil |字号大中小 订阅 ...
- Java定时任务技术分析
<从零打造项目>系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 ...
最新文章
- 关于在WINDOWS XP 下运行的PIX模拟器
- 南山中学2021级2班高考成绩查询,绵阳南山中学双语学校2021年排名
- 访问SAP C4C Business Configuration工作中心时遇到的错误信息
- PS比狠大赛!看看谁家的照片更丑!
- oracle中OEM证书失效怎么办,安全证书过期怎么办 网站安全证书失效处理【解决方法】...
- 系统困境与软件复杂度,为什么我们的系统会如此复杂
- 腾讯股价创新高:总裁刘炽平减持40万股 套现2.5亿港元
- 2017.8.11 think list
- todo elk搭建日志系统
- Layui table隐藏某一列
- python随机抽号_Python基础:手把手以实例教你学随机数产生和字符/ASCII码转换
- 第三节:python 交互和调用参数
- 小猪cms之怎样查询绑定的微网站模板
- 基于Java毕业设计医院药品管理系统源码+系统+mysql+lw文档+部署软件
- 5G时代传统室内覆盖方案迎挑战,融合室分系统应运而生
- 共享网络打印机无法连接计算机,电脑中出现共享打印机连接错误问题的解决方法...
- 你的大三,推荐做的几件事
- 当AI有了“自由意志”
- linux内核源码分析之proc文件系统(二)
- PREP 语法笔记 10