xxl-job

  • 写在前面
  • 特别注意
  • 一、环境搭建
    • 1.1、部署
    • 1.2、基于注册中心,自定义项目中引入xxl-job
  • 二、搭建完成,测试任务参数,执行机制等
    • 2.1、页面配置任务,包括启动条件
      • 2.1.1、执行器管理 > 新增执行器
      • 2.1.2、任务管理>新增任务
  • 三、监控和日志

写在前面

xxl-job是大众点评研发工程师许雪里,开源的任务调度系统,提供页面化操作,用于任务注册、发布、管理、监控、日志,以及集群环境中任务路由机制等等…详细可参照xxl官网介绍,这里只是记录一下学习过程,以及收获…

特别注意

参考学习时,一定要注意版本的区别…
后续版本,对任务定义,注册,进行了优化

我这里是 2.1.2 版本,就优化如下

方法任务支持:由原来基于JobHandler类任务开发方式,优化为支持基于方法的任务开发方式;因此,可以支持单个类中开发多个任务方法,进行类复用

一、环境搭建

1.1、部署

找到xxl-job,稳定版本,部署,或者本地启动测试,当作任务的注册中心,

设计基于Mysql存储的相关任务参数

这里贴一下,相关架构和配置

配置文件

1.2、基于注册中心,自定义项目中引入xxl-job

测试基本架构

配置文件


# web port
server.port=8081# log config
logging.config=classpath:logback.xml### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin### xxl-job executor address
xxl.job.executor.appname=xxl-job-executor-sample
xxl.job.executor.ip=
xxl.job.executor.port=9999### xxl-job, access token
xxl.job.accessToken=### xxl-job log path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job log retention days
xxl.job.executor.logretentiondays=30

参数简介

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

任务定义如下,官网示例中定义了四种参考使用方式

/*** XxlJob开发示例(Bean模式)** 开发步骤:* 1、在Spring Bean实例中,开发Job方法,方式格式要求为 "public ReturnT<String> execute(String param)"* 2、为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。* 3、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志;** @author xuxueli 2019-12-11 21:52:51*/
@Component
public class SampleXxlJob {private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);/*** 1、简单任务示例(Bean模式)*/@XxlJob("demoJobHandler")public ReturnT<String> demoJobHandler(String param) throws Exception {XxlJobLogger.log("XXL-JOB, Hello World.");for (int i = 0; i < 5; i++) {XxlJobLogger.log("beat at:" + i);TimeUnit.SECONDS.sleep(2);}return ReturnT.SUCCESS;}/*** 2、分片广播任务*/@XxlJob("shardingJobHandler")public ReturnT<String> shardingJobHandler(String param) throws Exception {// 分片参数ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();XxlJobLogger.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardingVO.getIndex(), shardingVO.getTotal());// 业务逻辑for (int i = 0; i < shardingVO.getTotal(); i++) {if (i == shardingVO.getIndex()) {XxlJobLogger.log("第 {} 片, 命中分片开始处理", i);} else {XxlJobLogger.log("第 {} 片, 忽略", i);}}return ReturnT.SUCCESS;}/*** 3、命令行任务*/@XxlJob("commandJobHandler")public ReturnT<String> commandJobHandler(String param) throws Exception {String command = param;int exitValue = -1;BufferedReader bufferedReader = null;try {// command processProcess process = Runtime.getRuntime().exec(command);BufferedInputStream bufferedInputStream = new BufferedInputStream(process.getInputStream());bufferedReader = new BufferedReader(new InputStreamReader(bufferedInputStream));// command logString line;while ((line = bufferedReader.readLine()) != null) {XxlJobLogger.log(line);}// command exitprocess.waitFor();exitValue = process.exitValue();} catch (Exception e) {XxlJobLogger.log(e);} finally {if (bufferedReader != null) {bufferedReader.close();}}if (exitValue == 0) {return IJobHandler.SUCCESS;} else {return new ReturnT<String>(IJobHandler.FAIL.getCode(), "command exit value("+exitValue+") is failed");}}/*** 4、跨平台Http任务*/@XxlJob("httpJobHandler")public ReturnT<String> httpJobHandler(String param) throws Exception {// requestHttpURLConnection connection = null;BufferedReader bufferedReader = null;try {// connectionURL realUrl = new URL(param);connection = (HttpURLConnection) realUrl.openConnection();// connection settingconnection.setRequestMethod("GET");connection.setDoOutput(true);connection.setDoInput(true);connection.setUseCaches(false);connection.setReadTimeout(5 * 1000);connection.setConnectTimeout(3 * 1000);connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");connection.setRequestProperty("Accept-Charset", "application/json;charset=UTF-8");// do connectionconnection.connect();//Map<String, List<String>> map = connection.getHeaderFields();// valid StatusCodeint statusCode = connection.getResponseCode();if (statusCode != 200) {throw new RuntimeException("Http Request StatusCode(" + statusCode + ") Invalid.");}// resultbufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));StringBuilder result = new StringBuilder();String line;while ((line = bufferedReader.readLine()) != null) {result.append(line);}String responseMsg = result.toString();XxlJobLogger.log(responseMsg);return ReturnT.SUCCESS;} catch (Exception e) {XxlJobLogger.log(e);return ReturnT.FAIL;} finally {try {if (bufferedReader != null) {bufferedReader.close();}if (connection != null) {connection.disconnect();}} catch (Exception e2) {XxlJobLogger.log(e2);}}}/*** 5、生命周期任务示例:任务初始化与销毁时,支持自定义相关逻辑;*/@XxlJob(value = "demoJobHandler2", init = "init", destroy = "destroy")public ReturnT<String> demoJobHandler2(String param) throws Exception {XxlJobLogger.log("XXL-JOB, Hello World.");return ReturnT.SUCCESS;}public void init(){logger.info("init");}public void destroy(){logger.info("destory");}}

二、搭建完成,测试任务参数,执行机制等

2.1、页面配置任务,包括启动条件

2.1.1、执行器管理 > 新增执行器


待 解决一

这里appName理应就是我们客户端里的自研项目的appName,如果填写正确,自动注册后,可自动找到 online 机器地址,如果乱写,自动注册是不能找到机器地址的,需要手动添加正确的机器地址,但这会影响任务执行吗?

待 解决二

单应用多点部署时,确保的单点执行机制

2.1.2、任务管理>新增任务

这里几个很重要的参数说明

  • 执行器:任务的绑定的执行器,任务触发调度时将会自动发现注册成功的执行器, 实现任务自动发现功能; 另一方面也可以方便的进行任务分组。每个任务必须绑定一个执行器, 可在 “执行器管理” 进行设置;

  • 任务描述:任务的描述信息,便于任务管理;

  • 路由策略:当执行器集群部署时,提供丰富的路由策略,包括;
    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所对应的任务的一次主动调度。

  • 任务超时时间:支持自定义任务超时时间,任务运行超时将会主动中断任务;

  • 失败重试次数;支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;

  • 报警邮件:任务调度失败时邮件通知的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔;

  • 负责人:任务的负责人;

  • 执行参数:任务执行所需的参数;

三、监控和日志

查看 运行报表和调度日志即可看到相关的监控、日志

xxl-job学习,基本测试1相关推荐

  1. DaoCloud Enterprise 5.0社区版永久免费!支持免费下载使用、学习和测试,体验企业级云原生底座的性能

    一直专注搞云原生的公司DaoCloud(中文名:道客)最近发布了新一代云原生操作系统DaoCloud Enterprise 5.0,并同步推出了DaoCloud Enterprise 5.0社区版,看 ...

  2. Java项目:课程在线学习与测试系统(java+SSM+redis+Bootstrap+Tomcat+mysql)

    源码获取:博客首页 "资源" 里下载! 基于B/S架构的课程在线学习与测试系统 启动说明 项目为maven管理,最近集成了redis,所以在运行项目是先要下载redis并启动客户端 ...

  3. 信息安全学习----渗透测试知识点

    信息安全学习----渗透测试知识点 信息收集 服务器的相关信息(真实ip,系统类型,版本,开放端口,WAF等) 网站指纹识别(包括,cms,cdn,证书等),dns记录 whois信息,姓名,备案,邮 ...

  4. ORACLE中triggers灰色的,Oracle之Triggers学习与测试_20091229

    Oracle Triggers学习与测试 <>P475 <>P567 目录 1 Introduction to Triggers 1.1 The events that fir ...

  5. 基于PHP+MySQL实现(Web)英语学习与测试平台【100010284】

    数据库课设:英语学习与测试平台 运行环境要求 PHP7.1+ 基于 thinkPHP6.0.Layui.Xadmin 开发 主要功能 公共模块 登录注册 个人信息修改 密码修改 教师模块 文章查看发布 ...

  6. 什么是渗透测试?如何学习渗透测试?

    渗透测试是网络安全体系中细分的就业方向之一,该岗位对实操经验.技术水平要求较高,必须通过专业的培训才可以满足企业用人需求.因此为了快速成为一名专业的渗透测试工程师,大部分人都会选择参加培训.那么什么是 ...

  7. java计算机毕业设计海南自贸港知识学习与测试MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计海南自贸港知识学习与测试MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计海南自贸港知识学习与测试MyBatis+系统+LW文档+源码+调试部署 本源码技术栈 ...

  8. java计算机毕业设计海南自贸港知识学习与测试源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计海南自贸港知识学习与测试源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计海南自贸港知识学习与测试源码+mysql数据库+系统+lw文档+部署 本源码技术栈: ...

  9. 计算机毕业设计Java海南自贸港知识学习与测试(源码+系统+mysql数据库+lw文档)

    计算机毕业设计Java海南自贸港知识学习与测试(源码+系统+mysql数据库+lw文档) 计算机毕业设计Java海南自贸港知识学习与测试(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目 ...

  10. [转载]学习让测试更精彩,测试让生命更精彩

    其实,这篇文章的名字我想了很久,最终定了这样一个标题.很多人会觉得太大了吧,学习和测试有关系,测试和生命的关联貌似没有那么大吧.其实不然,这篇文章提到的一种态度,是一种思想,是一种精神.我认为是测试同 ...

最新文章

  1. linux nice值_linux系统管理之交互式企业站点(连载)
  2. 修改CentOS 7.2系统的主机名
  3. Leetcode--448. 找到所有数组中消失的数字
  4. 小微企业——客户借款原因分析
  5. mysql数据库原理及应用实训报告_《数据库原理及应用》实验报告.doc
  6. 线性回归分析步骤总结
  7. WorldFirst万里汇推出港币和离岸人民币账户!
  8. NATAPP vscode SSH远程连接Linux服务器出现couldn‘t establish connection
  9. TT 的旅行日记 Week7作业B题
  10. CIO谈:基于K2 BPM平台怎么做报销?
  11. 卷积神经网络在物联网场景中的应用初探
  12. 蓝桥杯:跳蚂蚱【BFS】【Python】
  13. 力扣每日一题(九——保持城市天际线)
  14. java web 下拉列表_web中下拉列表的几种实现
  15. 互联网公司最常见的面试算法题大集合!
  16. 树莓派python界面qt_树莓派QT入门教程——使用Qt开发界面程序控制GPIO
  17. anemometer mysql5.6_Anemometer 慢查询日志监控平台
  18. flink学习笔记(五)
  19. 人大金仓数据库的归档日志
  20. 56,选择怪call,普通攻击,释放技能call,自己数据

热门文章

  1. 一个人窝在摇椅里乘凉 我承认这样真的很安详 和楼下老爷爷一样
  2. kd-tree和八叉树的概念及相关算法
  3. Oracle 中经常遇到的一些问题
  4. 移动硬盘、固态硬盘、机械硬盘总结
  5. 精伦安全模块-身份证读卡器对接-Qt调用SDK
  6. 微服务入门篇(二),万字长文带你实操作SpringCloudAlibaba微服务组件
  7. 自媒体一般都是去哪里搬运
  8. python隐秘的角落——笛卡尔之心
  9. 如何用读书构建你的思维世界
  10. C语言学生信息管理系统(结构体数组,文件)