注册 X
提交 注:点击提交后系统会发送邮件到邮箱验证!(仅支持中国大陆邮箱)
我已阅读并同意 服务条款
首页 > IT技术笔记 > 查看笔记

springboot使用xxl-job定时任务,分布式定时任务xxl-job的使用

一:概述

首先我们要知道什么是XXL-JOB?

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

XXL-JOB的有点特性:

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

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

3、调度中心HA(中心式):调度采用中心式设计,“调度中心”自研调度组件并支持集群部署,可保证调度中心HA; 4、执行器HA(分布式):任务分布式执行,任务”执行器”支持集群部署,可保证任务执行HA; 5、注册中心: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。同时,也支持手动录入执行器地址; 6、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务; 7、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等; 8、故障转移:任务路由策略选择”故障转移”情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。 9、阻塞处理策略:调度过于密集执行器来不及处理时的处理策略,策略包括:单机串行(默认)、丢弃后续调度、覆盖之前调度; 10、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务; 11、任务失败重试:支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;其中分片任务支持分片粒度的失败重试; 12、任务失败告警;默认提供邮件方式失败告警,同时预留扩展接口,可方便的扩展短信、钉钉等告警方式; 13、分片广播任务:执行器集群部署时,任务路由策略选择”分片广播”情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务,可根据分片参数开发分片任务; 14、动态分片:分片广播任务以执行器为维度进行分片,支持动态扩容执行器集群从而动态增加分片数量,协同进行业务处理;在进行大数据量业务操作时可显著提升任务处理能力和速度。 15、事件触发:除了”Cron方式”和”任务依赖方式”触发任务执行之外,支持基于事件的触发任务方式。调度中心提供触发任务单次执行的API服务,可根据业务事件灵活触发

……

是目前主流的分布式任务调度平台,许多公司的产品业务都有XXL-JOB的接入

二:使用

首先从GitHub上面将项目clone下来,如果网络问题导致速度慢也可以从Gitee上面拉取

GitHub地址:https://github.com/xuxueli/xxl-job

Gitee地址:https://gitee.com/xuxueli0323/xxl-job

从GitHub上面进行克隆或者下载压缩包

TEST+test@test MINGW64 ~/Desktop
$ git clone https://gitee.com/a_glass_of_wine/xxl-job.git

下载好之后将压缩包解压,

1、通过IDEA打开,将Maven编译好后项目结构如下

xxl-job-admin: 任务调度管理web界面

xxl-job-executor-sample-springboot:springboot demo项目

Dingtalk_20210728152344

2、然后运行doc\db目录的tables_xxl_job.sql文件,在Navcat中去运行,生成需要的表

Dingtalk_20210728152804

3、打开xxl-job-admin模块,在application.properties中进行后台的配置

Dingtalk_20210728153448

4、启动XxlJobAdminApplication,打开管理界面

Dingtalk_20210728153718

5、启动任务执行器XxlJobExecutorApplication

定位到SampleXxlJob.java,我们执行demoJobHandler任务测试一下

Dingtalk_20210728153916

6、进入管理界面的任务管理,操作执行一次,可以看到控制台已经打印了执行日志信息了

关于XXL-JOB的基本使用就到这里了

三:在springboot项目中去集成也很简单

在项目中引入依赖

<!-- xxl-job 定时任务 -->
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.3.0</version>
        </dependency>

将xxl-job-executor-sample-springboot这个模块下的XxlJobConfig复制一份到项目中,然后将相关配置设置好即可

再项目的application.yml新增如下配置:

# 调度中心部署跟地址:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调"
xxl:
  job:
    admin:
      addresses: http://127.0.0.1:8088/xxl-job-admin
# 执行器"AppName"和地址信息配置:AppName执行器心跳注册分组依据;地址信息用于"调度中心请求并触发任务"和"执行器注册"。执行器默认端口为9999,执行器IP默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用。单机部署多个执行器时,注意要配置不同执行器端口
    executor:
      appname: xxl-job-executor-sample1
      address:
      ip:
      port: 9998
      # 执行器运行日志文件存储的磁盘位置,需要对该路径拥有读写权限
      logpath: /data/applogs/xxl-job/jobhandler
      # 执行器Log文件定期清理功能,指定日志保存天数,日志文件过期自动删除。限制至少保持3天,否则功能不生效;
      logretentiondays: -1
    # 执行器通讯TOKEN,非空时启用
    accessToken:

新建一个DemoJob进行测试

Dingtalk_20210728154811

启动应用,查看日志已经成功注册到xxl-job-admin

Dingtalk_20210728154608

问题

XXL-JOB注册成功但是在管理界面里不显示

场景描述:

在配置正确,调度中心admin和执行器executor启动成功的情况下,在管理界面看不到我们的执行器,只能看到xxl的示例执行器。

但是在xxl_job_registry表里(执行器注册成功会插入到这张表里),有新增的记录,表明我的执行器是注册成功了的。

那为什么不显示呢?

这个时候我去xxl_job_group表里去看,只有示例执行器的信息,并没有我的执行器信息。

原因分析及解决办法:

执行器启动之后会自动向admin端注册自己,这一步是没有问题的, 在xxl_job_registry表我们也看到了注册记录。

但是在xxl_job_group表里,没有看到我们的自己的执行器。

因此我们仍然需要在执行器管理界面去新增执行器,执行器的信息根据自己的项目信息填,选择“自动注册”即可。新增成功之后,就可以在xxl_job_group表里看到我们的执行器信息。有一点需要注意的时候,xxl_job_group新增成功之后,address_list字段可能没有立即有值,这是因为心跳注册存在短暂延时,可以稍等下。

按照上述方案手动新增执行器后,在执行器管理界面就可以看到我们的执行器。

Dingtalk_20210728155626

这个时候,有些人可能会有一个困惑,为什么示例执行器不需要手动在界面新增就可以显示,而我自己的执行器需要手动新增?

因为按照官网的操作说明,我们一般会执行里面的sql文件tables_xxl_job.sql。在sql里面,有下面一句标红的sql。这条sql手动把示例执行器插入到了xxl_job_group里面,这也就是示例执行器为什么不需要在界面手动新增的原因。

INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `order`, `address_type`, `address_list`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 1, 0, NULL);
INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_cron`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `executor_route_strategy`, `executor_handler`, `executor_param`,
 `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) 
 VALUES (1, 1, '0 0 0 * * ? *', '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 
 'GLUE代码初始化', '2018-11-03 22:21:31', '');



		        

		      

 打赏        分享



评论

邮箱: 昵称: