分享围绕的问题:

1.是什么?
2.解决什么问题?
3.怎么使用?

一.xxl_job是什么?

个人看法--现有的定时任务的缺点:

spring task:
	加入一个注解enableschdula
	写一个方法 添加一个注解 指定cron表达式
	不支持集群 不能及时停止
quratz:
	配置相对多
	支持集群,实现很麻烦,配置多
timer:
	原生,使用起来麻烦

分布式定时任务解决以上的问题:xxl-job,elastic-job,oracle job.

xxl-job是什么

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

什么是任务调度?
某一时间段进行任务的操作。

具体任务调度有哪些应用的场景?
1.时间驱动:房贷短信,营销类短信,对账单.日结等
2.数据驱动:数据同步、异步数据交换等。

二.xxl_job解决什么问题?

xxl-job的特性

1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;

2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;

3、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;

4、故障转移:任务路由策略选择”故障转移”情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。

5、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务

6、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行

7、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件;

8、任务进度监控:支持实时监控任务进度.

xxl-job的几个角色

原生定时任务的概念:

  • 调度器 :负责对用户定义的所有任务进行调度。

  • 触发器 : 触发器在逻辑上包含两个属性,即如何触发该调度器和触发该调度器之后进行怎么样的操作

  • 任务 : 触发器在被触发后进行的操作,可以指定任意一个类的某个方法。

    举例来说:

 

xxl-job中的角色说明

  • 调度中心 : 将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求

  • 执行器(触发器): 将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑

  • 任务: 具体执行的逻辑代码

“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性。

xxl-job的架构

XXL-JOB架构图 v2.1.0

 

xxl-job的安装

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

参考文档地址:分布式任务调度平台XXL-JOB

三.jeecg-boot的集成xxl_job

一.引入xxl-job定时任务依赖

<!-- 引入定时任务依赖 -->
<dependency>
    <groupId>org.jeecgframework.boot</groupId>
    <artifactId>jeecg-boot-starter-job</artifactId>
</dependency>

二.编写定时任务客户端handler

@Component
@Slf4j
public class DemoJobHandler {

    @XxlJob(value = "demoJob")
    public ReturnT<String> demoJobHandler(String params) {
        log.info("我是定时任务,我执行了...............................");
        return ReturnT.SUCCESS;
    }
}

三. 修改 jeecg-dev.yaml 配置文件

1.开启 xxljob

 2.修改 xxljob-admin的服务连接配置

四. 启动服务端 xxl-job-admin

1 初始化数据库

 执行脚本:https://github.com/xuxueli/xxl-job/blob/2.2.0/doc/db/tables_xxl_job.sql

2 启动xxl-job-admin

修改数据连接等配置 找到类 com.xxl.job.admin.XxlJobAdminApplication, 右键运行

3 访问管理界面

1.首先要启动 nacos 服务和 JeecgSystemCloudApplication 再起xxl_job服务,注意:登录nacos 看cloud是否注册成功,xxl_job不用注册上去的
2.浏览器登录访问,http://localhost:9080/xxl-job-admin 新增执行器 一定要注意机器地址 http://192.168.1.55:10001/ 的配置
3.修改配置是要在 nacos上修改的 开启  true

 

新增定时任务

 

 

Xxl-job的任务管理

任务管理中 XXL-JOB项目中包含了2中基本的任务类型:

Bean模式任务       需要在项目中编写代码执行
GLUE模式(Java)    直接在调度中心进行配置在线维护执行,能立即生效

Bean(类)模式

Bean模式任务,支持基于类的开发方式,每个任务对应一个Java类

  • 优点:不限制项目环境,兼容性好。即使是无框架项目,如main方法直接启动的项目也可以提供支持,可以参考示例项目 “xxl-job-executor-sample-frameless”;

  • 缺点:

    • 每个任务需要占用一个Java类,造成类的浪费;

    • 不支持自动扫描任务并注入到执行器容器,需要手动注入。

GLUE模式(Java)

任务以源码为JAVA的方式维护在调度中心,支持通过Web IDE在线更新,实时编译和生效,因此不需要指定JobHandler

解释说明:

- 执行器:任务的绑定的执行器,任务触发调度时将会自动发现注册成功的执行器, 实现任务自动发现功能; 另一方面也可以方便的进行任务分组。每个任务必须绑定一个执行器, 可在 "执行器管理" 进行设置;
- 任务描述:任务的描述信息,便于任务管理;
- 路由策略:当执行器集群部署时,提供丰富的路由策略,包括;
    FIRST(第一个):固定选择第一个机器;
    LAST(最后一个):固定选择最后一个机器;
    ROUND(轮询):;
    RANDOM(随机):随机选择在线的机器;
    CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
    LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举;
    LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;
    FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;
    BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
    SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;
- Cron:触发任务执行的Cron表达式;
- 运行模式:
    BEAN模式:任务以JobHandler方式维护在执行器端;需要结合 "JobHandler" 属性匹配执行器中任务;
    GLUE模式(Java):任务以源码方式维护在调度中心;该模式的任务实际上是一段继承自IJobHandler的Java类代码并 "groovy" 源码方式维护,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器里中的其他服务;
    GLUE模式(Shell):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "shell" 脚本;
    GLUE模式(Python):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "python" 脚本;
    GLUE模式(PHP):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "php" 脚本;
    GLUE模式(NodeJS):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "nodejs" 脚本;
    GLUE模式(PowerShell):任务以源码方式维护在调度中心;该模式的任务实际上是一段 "PowerShell" 脚本;
- JobHandler:运行模式为 "BEAN模式" 时生效,对应执行器中新开发的JobHandler类“@JobHandler”注解自定义的value值;
- 阻塞处理策略:调度过于密集执行器来不及处理时的处理策略;
    单机串行(默认):调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行;
    丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败;
    覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务;
- 子任务:每个任务都拥有一个唯一的任务ID(任务ID可以从任务列表获取),当本任务执行结束并且执行成功时,将会触发子任务ID所对应的任务的一次主动调度。
- 任务超时时间:支持自定义任务超时时间,任务运行超时将会主动中断任务;
- 失败重试次数;支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;
- 报警邮件:任务调度失败时邮件通知的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔;
- 负责人:任务的负责人;
- 执行参数:任务执行所需的参数;

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐