定时任务

63 阅读4分钟

定时任务

简述

  • 周期性执行、定时执行的任务

技术方案

JDK内置

Timer

  • Timer底层是使用一个单线来实现多个Timer任务处理的。所有任务都是由同一个线程来调度,所有任务都是串行执行,意味着同一时间只能有一个任务得到执行,而前一个任务的延迟或者异常会影响到之后的任务
  • 不建议使用

ScheduleExecutorService

  • ScheduledExecutorService是基于线程池的,可以开启多个线程进行执行多个任务,每个任务开启一个线程; 这样任务的延迟和未处理异常就不会影响其它任务的执行了
  • 可以替代Timer进行使用

Netty

简述

  • Netty根据时间轮(Timing Wheel)开发了HashedWheelTimer工具类,用来优化I/O超时调度(本质上是延迟任务);
  • 之所以采用时间轮(Timing Wheel)的结构,还有一个很重要的原因是I/O超时这种类型的任务对时效性不需要非常精准
  • 时间轮(Timing Wheel)
    • 时间轮(Timing Wheel)是George Varghese和Tony Lauck在1996年的论文中实现的。它在Linux内核中使用广泛,是Linux内核定时器的实现方法和基础之一
    • 时间轮(Timing Wheel)是一种环形的数据结构,就像一个时钟可以分成很多格子(Tick),每个格子代表时间的间隔,它指向存储的具体任务(timerTask)的一个链表
    • HashedWheelTimer

依赖

<dependency>    
	<groupId>io.netty</groupId>    
	<artifactId>netty-all</artifactId>
</dependency>

Spring集成

Schedule

Spring自带Schedule

  • 相关注解
    • @EnableScheduling。启用定时任务
    • @Scheduled。定义任务

Quartz

简述

  • Quartz是OpenSymphony开源组织在Job scheduling领域的一个开源项目
  • 纯java实现,可以作为独立的应用程序,也可以嵌入在另一个独立式应用程序运行
  • 强大的调度功能,Spring默认的调度框架,灵活可配置
  • 作业持久化,调度环境持久化机制,可以保存并恢复调度现场
  • 分布式和集群能力,可以被实例化,一个Quartz集群中的每个节点作为一个独立的Quartz使用,通过相同的数据库表来感知到另一个Quartz应用

依赖

<dependency>    
	<groupId>org.springframework.boot</groupId>    
	<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

分析

  • Job
    • 表示一个工作,要执行的具体内容
  • JobDetail
    • 表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略
  • Trigger
    • 代表一个调度参数的配置,什么时候去调
  • Scheduler
    • 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger

存储方式

  • RAMJobStore(内存中)
    • 在默认情况下Quartz将任务调度的运行信息保存在内存中,这种方法提供了最佳的性能,因为内存中数据访问最快。
    • 不足之处是缺乏数据的持久性,当程序路途停止或系统崩溃时,所有运行的信息都会丢失
  • JobStoreTX(数据库中)
    • 所有的任务信息都会保存到数据库中,可以控制事务
    • 如果应用服务器关闭或者重启,任务信息都不会丢失
    • 可以恢复因服务器关闭或者重启而导致执行失败的任务

分布式集群

Quartz持久化JDBC方式

Elastic-job

简述

  • ElasticJob 是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目 ElasticJob-Lite 和 ElasticJob-Cloud 组成。
  • 它通过弹性调度、资源管控、以及作业治理的功能,打造一个适用于互联网场景的分布式调度解决方案,并通过开放的架构设计,提供多元化的作业生态
  • ElasticJob 也提供了UI控制台的功能,包括作业操作和作业历史

依赖

<dependency>    
	<groupId>org.apache.shardingsphere.elasticjob</groupId>    		<artifactId>elasticjob-lite-spring-boot-starter</artifactId>
</dependency>

xxl-job

简述

  • XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。
  • 现已开放源代码并接入多家公司线上产品线,开箱即用

依赖

<dependency>    
	<groupId>com.xuxueli</groupId>    
	<artifactId>xxl-job-core</artifactId>
</dependency>

使用方式

  • Bean模式(基于方法)
  • Bean模式(基于类)
  • GLUE模式

其它

Cron表达式

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义