• 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定时任务汇总相关推荐

  1. Java知识汇总-思维导图

    2019独角兽企业重金招聘Python工程师标准>>> Java知识点汇总,从基础到常用的API.还有常用的集合类,总结的很详细.图片是从论坛里面找到的,整理下来以便常复习.这是目前 ...

  2. java定时任务,每天定时执行任务

    java定时任务,每天定时执行任务.以下是这个例子的全部代码. public class TimerManager {//时间间隔private static final long PERIOD_DA ...

  3. java定时任务框架elasticjob详解

    这篇文章主要介绍了java定时任务框架elasticjob详解,Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.该项目基于成熟的开源产品Quartz和Zo ...

  4. Springboot2 Quartz实现JAVA定时任务的动态配置

    动态配置Quartz.没接触过定时任务的同学可以先看下此篇:JAVA定时任务实现的几种方式 文章目录 一.需求背景 1. 问题现象 2. 问题分析 3. 解决方案 二.需求背景 2.1. maven依 ...

  5. Java定时任务解决方案

    Java定时任务解决方案 参考文章: (1)Java定时任务解决方案 (2)https://www.cnblogs.com/zhixiang-org-cn/p/9490877.html (3)http ...

  6. Java知识点汇总以及常见面试题

    Java知识点汇总以及常见面试题 1. "=="和equals()的区别 2. 构造方法能不能重写或者重载 3. 基本数据类型 4. 匿名内部类能被继承? 5. Integer和i ...

  7. Java定时任务(一) Timer及TimerTask的案例解析及源码分析

    Java定时任务(一)  Timer及TimerTask的案例解析及源码分析 一.概述: 定时任务这个概念在Java的学习以及项目的开发中并不陌生,应用场景也是多种多样.比如我们会注意到12306网站 ...

  8. JAVA定时任务的简单实现

    Java定时任务的简单实现 2011-01-02 18:34:43|  分类: 软件开发 |  标签:void  timer  import  param  dateutil   |字号大中小 订阅 ...

  9. Java定时任务技术分析

    <从零打造项目>系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 ...

最新文章

  1. 关于在WINDOWS XP 下运行的PIX模拟器
  2. 南山中学2021级2班高考成绩查询,绵阳南山中学双语学校2021年排名
  3. 访问SAP C4C Business Configuration工作中心时遇到的错误信息
  4. PS比狠大赛!看看谁家的照片更丑!
  5. oracle中OEM证书失效怎么办,安全证书过期怎么办 网站安全证书失效处理【解决方法】...
  6. 系统困境与软件复杂度,为什么我们的系统会如此复杂
  7. 腾讯股价创新高:总裁刘炽平减持40万股 套现2.5亿港元
  8. 2017.8.11 think list
  9. todo elk搭建日志系统
  10. Layui table隐藏某一列
  11. python随机抽号_Python基础:手把手以实例教你学随机数产生和字符/ASCII码转换
  12. 第三节:python 交互和调用参数
  13. 小猪cms之怎样查询绑定的微网站模板
  14. 基于Java毕业设计医院药品管理系统源码+系统+mysql+lw文档+部署软件
  15. 5G时代传统室内覆盖方案迎挑战,融合室分系统应运而生
  16. 共享网络打印机无法连接计算机,电脑中出现共享打印机连接错误问题的解决方法...
  17. 你的大三,推荐做的几件事
  18. 当AI有了“自由意志”
  19. linux内核源码分析之proc文件系统(二)
  20. PREP 语法笔记 10

热门文章

  1. 发布 apk 到小米应用商店
  2. 照明工程需要什么资质
  3. Cimage类处理图像像素(数据)的3种方式
  4. freemarker转PDF,支持分页,增加页眉页脚
  5. 1.2基本IO口控制
  6. 怎么把pdf转换为excel表格?有什么实用的转换工具?
  7. Apipost让您轻松完成接口测试及接口文档,告别加班
  8. 从数据库中查找数据并按首字母排序
  9. PHP登录与注册页面简单实现(包含数据库验证)(包含数据库)
  10. 20级北京信息科技大学C语言考试大题题库(完整最简版)