提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 可视化界面
- 1 新增执行器
- 2.新增任务
- **执行器**:
- **任务描述**:
- **路由策略**:
- **Cron**:
- cron表达式
- **运行模式**
- JobHandler
- 子任务:
- 阻塞处理策略:
- 任务参数:
- 报警邮件:
- 负责人:
- 3. BEAN模式任务
- 4.GLUE(Java)模式任务,
- 5.分片广播任务
- 6.任务管理
- 7.任务调度日志
- 1.查看调度日志
- 2.查看执行日志
- 3.终止运行中的任务
- 4.删除执行日志
- 8 执行失败报警
可视化界面
1 新增执行器
新增执行器时,需要填写的信息,如下所示:
-
AppName:这是用来唯一标识每个执行器集群的应用名称,执行器会周期性地以AppName为参数进行自动注册。可通过该配置自动发现注册成功的执行器,供任务调度时使用。
-
名称:执行器的名称,因为AppName限制字母数字等组成,可读性不强,名称可以提高执行器的可读性。
-
排序:执行器的排序,系统中需要执行器的地方,如任务新增,将会按照该排序读取可用的执行器列表。
-
注册方式:调度中心获取执行器地址的方式,有以下两种:
-
自动注册:执行器自动进行执行器注册,调度中心通过底层注册表可以动态发现执行器机器地址。
-
手动录入:人工手动录入执行器的地址信息,多地址逗号分隔,供调度中心使用。
-
机器地址:只有在“注册方式”为“手动录入”时可编辑,支持人工维护执行器的地址信息。
注意,AppName的取值应该和示例工程的application.properties文件中的xxl.job.executor.appname字段的取值相同,注册方式应该选择自动注册。新增完成之后,就可以在执行器列表中看到新建的执行器, 而我在写入的时候将applcation.properties替换为了bootstrap.yml,但内容不变;
2.新增任务
执行器:
- 任务绑定的执行器,任务触发调度时将会自动发现注册成功的执行器,实现任务自动发现功能;另一方面,也可以方便地进行任务分组。每个任务必须绑定一个执行器,可以在“执行器管理”页面进行设置。
任务描述:
- 任务的描述信息,便于任务管理。
路由策略:
- 当执行器集群部署时,提供丰富的路由策略,包括:
策略 | 参数值 | 详细含义 |
---|---|---|
第一个 | FIRST | 固定选择第一个机器 |
最后一个 | LAST | 固定选择最后一个机器 |
轮询 | ROUND | 依次选择执行 |
随机 | RANDOM | 随机选择在线的机器 |
一致性HASH | CONSISTENT_HASH | 每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上 |
最不经常使用 | LEAST_FREQUENTLY_USED | 使用频率最低的机器优先被选举 |
最近最久未使用 | LEAST_RECENTLY_USED | 最久未使用的机器优先被选举 |
故障转移 | FAILOVER | 按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度 |
忙碌转移 | BUSYOVER | 按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度 |
分片广播 | SHARDING_BROADCAST | 广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务 |
Cron:
触发任务执行的Cron表达式,
cron表达式
运行模式
-
BEAN模式:任务以JobHandler的方式维护在执行器端;需要结合 “JobHandler”属性匹配执行器中的任务;
-
GLUE模式(Java):任务以源码方式维护在调度中心;该模式的任务实际上是一段继承自IJobHandler的Java类代码并以“groovy”源码的方式维护,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器里中的其他服务;
-
GLUE模式(Shell):任务以源码方式维护在调度中心;该模式的任务实际上是一段“shell”脚本;
-
GLUE模式(Python):任务以源码方式维护在调度中心;该模式的任务实际上是一段“python”脚本;
-
GLUE模式(NodeJS):任务以源码方式维护在调度中心;该模式的任务实际上是一段“nodejs”脚本;
JobHandler
- 只有在运行模式为“BEAN模式”时生效,对应执行器中新开发的JobHandler类的“@JobHandler”注解自定义的value值。
子任务:
- 每个任务都拥有一个唯一的任务ID(任务ID可以从任务列表获取),当本任务执行结束并且执行成功时,将会触发子任务ID所对应的任务的一次主动调度。
阻塞处理策略:
调度过于密集,执行器来不及处理时的处理策略:
- 失败告警(默认):调度失败和执行失败时,都将会触发失败报警,默认会发送报警邮件。
- 失败重试:调度失败时,除了进行失败告警之外,将会自动重试一次;注意在执行失败时不会重试,而是根据回调返回值判断是否重试。
策略 | 参数值 | 详细含义 |
---|---|---|
单机串行,默认 | SERIAL_EXECUTION | 调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行 |
丢弃后续调度 | DISCARD_LATER | 调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败 |
覆盖之前调度 | COVER_EARLY | 调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务 |
任务参数:
- 任务执行所需的参数,多个参数时用逗号分隔,任务执行时将会把多个参数转换成数组传入。
报警邮件:
- 任务调度失败时邮件通知的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔。
负责人:
- 任务的负责人。
3. BEAN模式任务
任务逻辑以JobHandler的形式存在于“执行器”所在项目中,如我们刚刚所演示的Hello,World 的入门案例
上述代码有三点需要注意:
- 必须使用XXL-JOB的@JobHandler注解(第1行),指定JobHandler的名称为“demoJobHandler”,在调度中心新建任务的JobHandler字段的取值要与此相同。
- 必须继承IJobHandler抽象类(第3行),并且实现它的execute()方法,这是实现任务逻辑的方法。
- IJobHandler抽象类还有init()方法和destroy()方法,这两个方法是空方法,在任务实例初始化和销毁时调用,任务实现类可以选择性地覆盖这两个方法。
4.GLUE(Java)模式任务,
任务以源码方式维护在调度中心,支持通过Web IDE在线更新,实时编译和生效,因此不需要指定JobHandler。开发流程如下:
Step-1 新建调度任务
- 参考上文“任务调度属性”对新建的任务进行参数配置,运行模式选择“GLUE模式(Java)”,如下图所示
调度中心会每隔15分钟调度一次这个任务。
Step-2 开发任务代码
- 在任务列表中选中指定的GLUE(Java)任务,点击该任务右侧的“GLUE”按钮,将会前往GLUE任务的Web
IDE界面,在该界面支持对任务代码进行开发(也可以在IDE中开发完成后,复制粘贴到编辑中)。 - 版本回溯功能:在GLUE任务的Web IDE界面,选择右上角下拉框“版本回溯”,会列出该GLUE任务的更新历史(支持30个版本的版本回溯),选择相应版本即可显示该版本代码,保存后GLUE代码即回退到对应的历史版本。GLUE任务代码和Web IDE界面,如下图所示:
5.分片广播任务
执行器集群部署时,任务路由策略选择“分片广播”的情况下,一次任务调度将会广播触发对应集群中所有执行器执行一次任务,同时传递分片参数,可以根据分片参数开发分片任务。
- “分片广播”以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。
- “分片广播”和普通任务开发流程一致,不同之处在于可以获取分片参数,通过分片参数进行分片业务处理。开发流程如下:
Step-1 开发JobHandler代码
在示例工程的com.example.demo.jobhandler包中,新建ShardingJobHandler任务类,关键代码如下所示:
@JobHandler(value="shardingJobHandler")
@Service
public class ShardingJobHandler extends IJobHandler {
@Override
public ReturnT<String> execute(String param) throws Exception {
// 分片参数
ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();
XxlJobLogger.log("分片参数:当前分片序号 = {0}, 总分片数 = {1}", shardingVO.getIndex(), shardingVO.getTotal());
// 业务逻辑
for (int i = 0; i < shardingVO.getTotal(); i++) {
if (i == shardingVO.getIndex()) {
XxlJobLogger.log("第 {0} 片, 命中分片开始处理", i);
} else {
XxlJobLogger.log("第 {0} 片, 忽略", i);
}
}
return SUCCESS;
}
}
上述代码的第9行获取分片参数,第10行获取分片参数的两个属性:
- shardingVO.getIndex() 当前分片序号(从0开始),执行器集群列表中当前执行器的序号。
- shardingVO.getTotal() 总分片数,执行器集群的总机器数量。
Step-2 新建调度任务
参考上文“任务调度属性”对新建的任务进行参数配置,运行模式选择“BEAN模式”,路由策略选择“分片广播”,JobHandler属性填写任务注解@JobHandler中定义的值,如下图所示:
调度中心会每隔15分钟广播调度一次shardingJobHandler任务(因为Corn表达式设置了15分钟执行一次)。
分片广播的路由策略不仅适用于BEAN运行模式,而且也适用于GLUE(Java)运行模式。这项功能适用于以下业务场景:
- 分片任务场景
10个执行器的集群来处理10w条数据,每台机器只需要处理1w条数据,耗时降低10倍。 - 广播任务场景
广播执行器机器运行shell脚本、广播集群节点进行缓存更新等。
6.任务管理
在任务列表中,可以看到每个任务的任务ID、任务描述、运行模式、Cron、负责人和状态等信息。用户可以对任务进行以下几种操作:
-
执行:手动触发一次任务调度,不影响原有调度规则。
-
暂停/恢复:可对任务进行“暂停”和“恢复”操作。需要注意的是,此处的暂停/恢复仅针对任务的后续调度触发行为,不会影响到已经触发的调度任务。
-
日志:可以查看任务历史调度日志。在历史调入日志界面可查看每次任务调度的调度结果、执行结果等,点击“执行日志”按钮可查看执行器完整日志。
-
编辑:在弹出的“编辑任务”界面更新任务属性后保存即可,可以修改设置的任务属性信息。
-
GLUE:该操作仅针对GLUE任务。将会前往GLUE任务的Web IDE界面,在该界面支持对任务代码进行开发。
-
删除:删除这个任务。
7.任务调度日志
- 在XXL-JOB调度中心,点击进入“调度日志”页面。
1.查看调度日志
在“调度日志”页面可以查看每次任务调度的调度结果、执行结果等信息,
从调度日志可以获取以下信息:
-
调度时间:“调度中心”触发本次调度并向“执行器”发送任务执行信号的时间。
-
调度结果:“调度中心”触发本次调度的结果,200表示成功,500或其他表示失败。
-
调度备注:“调度中心”触发本次调度的日志信息。
-
执行时间:“执行器”中本次任务执行结束后回调的时间。
-
执行结果:“执行器”中本次任务执行的结果,200表示成功,500或其他表示失败。
-
执行备注:“执行器”中本次任务执行的日志信息。
在示例工程中,调度日志位于/data/applogs/xxl-job/xxl-job-demo.log,可以在logback.xml文件中进行配置。
2.查看执行日志
点击某行日志右侧的 “执行日志” 按钮,可跳转至执行日志界面,可以查看业务代码中打印的完整日志,如下图:
3.终止运行中的任务
这项功能只针对执行中的任务。在任务日志页面,点击右侧的“终止任务”按钮,将会向本次任务对应的执行器发送任务终止请求,将会终止掉本次任务,同时会清空掉整个任务执行队列,如下图所示
- 任务终止是通过“interrupt”执行线程的方式实现的,将会触发“InterruptedException”异常。因此,如果JobHandler内部捕获到该异常并消化掉的话,任务终止功能将不起作用。
- 因此, 如果遇到上述任务终止不起作用的情况,需要在JobHandler中针对“InterruptedException”异常进行特殊处理(向上抛出)。另外,在JobHandler中开启子线程时,子线程也不可捕获处理“InterruptedException”,应该主动向上抛出。
4.删除执行日志
在任务日志页面,选择执行器和任务之后,点击右侧的“清理”按钮将会出现“日志清理”弹框,弹框中支持选择不同类型的日志清理策略,选中后点击“确定”按钮即可进行日志清理操作,如下图所示:
8 执行失败报警
概述: 当定时任务执行失败的时候,日志会自动记录失败结果,并且在cdmtc.xxl-job里面的application.properties中配置了email邮箱时,可邮件提醒;
效果演示:
每一次执行失败均可提醒
开启短信提醒功能,需要从邮箱中获取授权码,每个邮箱的获取方式可能不同,可具体百度;qq邮箱为从 设置 按钮中的 账户 ,然后选择POP3/SMTP 服务,点击开启,按提示获取授权码即可;
获取授权码图示:
授权码就是配置文件中的password