原因

最近在公司写一些job,公司使用的是spring boot提供的注解形式实现的。
这样在自测的时候很麻烦,而且测试提测的时候需要修改cron表达式->提交git->jenkins打包重启

解决方案

查阅资料后决定选用任务调度平台,有很多优秀的任务调度平台,选择xxl-job是因为文档清晰、使用简单、基于远程RPC调用、官方提供spring boot例子。

部署

首先需要执行官网提供的sql
使用docker下载镜像 这里最新版本是2.0.2

docker pull xuxueli/xxl-job-admin:2.0.2

然后运行docker镜像 注意修改参数

docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://数据库地址:3306/xxl-job?Unicode=true&characterEncoding=UTF-8 --spring.datasource.password=数据库密码 --spring.mail.host=smtp.163.com --spring.mail.username=邮箱名 --spring.mail.password=邮箱密码 --xxl.job.login.password=登录密码" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin --privileged=true  -d xuxueli/xxl-job-admin:2.0.2

注意一些参数如邮箱可以省略

在项目中配置

这里配置使用官网示例中的spring boot配置

@Configuration
public class XxlJobConfig {private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.executor.appname}")private String appName;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${xxl.job.executor.logpath}")private String logPath;@Value("${xxl.job.executor.logretentiondays}")private int logRetentionDays;@Bean(initMethod = "start", destroyMethod = "destroy")public XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppName(appName);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}
}

官网给出的执行器配置说明

### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
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时生效,启用执行器Log文件定期清理功能,否则不生效;
xxl.job.executor.logretentiondays=-1

执行器

官方给出了不少执行器,但是要在原有项目上改造需要自己写执行器,当然可以使用一个任务写一个执行器,这样执行器就会很多,很难以维护。所以这里采用反射的方式
首先是全类名执行器使用反射的方式

@Component
@JobHandler(value = "BeanByClassHandler")
public class BeanByClassHandler extends IJobHandler {@Autowiredprivate ApplicationContext applicationContext;//根据完整类名 通过反射执行指定方法@Overridepublic ReturnT<String> execute(String param) throws Exception {XxlJobLogger.log(param);if (param == null || param.equals("")) {return new ReturnT<>(ReturnT.FAIL_CODE, "参数不能为空!");}String[] split = param.split(",");if (split == null || split.length < 2) {return new ReturnT<>(ReturnT.FAIL_CODE, "参数格式错误,应为 完整类名,方法名");}Class taskBeanClass = null;try {taskBeanClass = Class.forName(split[0]);} catch (Exception e) {return new ReturnT<>(ReturnT.FAIL_CODE, "类" + split[0] + "不存在");}Method method = null;try {method = taskBeanClass.getMethod(split[1]);} catch (Exception e) {return new ReturnT<>(ReturnT.FAIL_CODE, "方法" + split[1] + "不存在");}Object o = applicationContext.getBean(taskBeanClass);if (o == null) {return new ReturnT<>(ReturnT.FAIL_CODE, "在Application中类不存在");}try {method.invoke(o);} catch (Exception e) {return new ReturnT<>(ReturnT.FAIL_CODE, "方法执行失败");}return new ReturnT<>(ReturnT.SUCCESS_CODE, "执行成功");}
}

这样全类名很长所以可以使用spring管理beanName获得实例进行反射

@Component
@JobHandler(value = "BeanByNameHandler")
public class BeanByNameHandler extends IJobHandler {@Autowiredprivate ApplicationContext applicationContext;//根据spring管理的bean name获取指定类@Overridepublic ReturnT<String> execute(String param) throws Exception {XxlJobLogger.log(param);if (param == null || param.equals("")) {return new ReturnT<>(ReturnT.FAIL_CODE, "参数不能为空!");}String[] split = param.split(",");if (split == null || split.length < 2) {return new ReturnT<>(ReturnT.FAIL_CODE, "参数格式错误,应为bean名称,方法名");}Object o = applicationContext.getBean(split[0]);if(o == null){return new ReturnT<>(ReturnT.FAIL_CODE,"类在applicationContext中不存在");}Method method;try {method = o.getClass().getMethod(split[1]);}catch (Exception e){return new ReturnT<>(ReturnT.FAIL_CODE,"方法"+split[1]+"不存在");}try {method.invoke(o);}catch (Exception e){return new ReturnT<>(ReturnT.FAIL_CODE,"调用方法失败");}return new ReturnT<>(ReturnT.SUCCESS_CODE,"调用job成功");}
}

调用

在web界面新建任务 参数为 全类名,方法名即可。如下图所示

当然也可以执行shell脚本

缺点

  1. xxl-job只支持mysql数据库,公司使用的Oracle 所以docker需要运行一个mysql数据库
  2. xxl-job截至2.0.2版本没有提供多用户及权限管理

转载于:https://www.cnblogs.com/ingxx/p/11274508.html

docker部署xxl-job 通用反射执行器相关推荐

  1. 手牵手教Docker部署Springboot+vue ,全过程十分详细,轻松完成项目部署(简单,高效,通用)

    手把手教Docker部署Springboot+vue ,详细全过程,轻松完成项目部署(简单,高效) 上线前准备 腾讯云的服务器,服务器安装好docker 和docker-compose 最好事先了解技 ...

  2. Docker 部署SpringBoot项目不香吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:流星007 链接:toutiao.com/i68433912 ...

  3. ASP.NET Core微服务(七)——【docker部署linux上线】(RDS+API接口测试部分)

    ASP.NET Core微服务(七)--[docker部署linux上线]: 本文测试采用阿里云的RDS(sqlserver服务器)+ECS(linux服務器)进行测试,由于是测试,[按量付费]买个最 ...

  4. docker部署flask_使用Docker,GCP Cloud Run和Flask部署Scikit-Learn NLP模型

    docker部署flask A brief guide to building an app to serve a natural language processing model, contain ...

  5. swagger入门和实践(含docker部署swagger)

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 简介 Swagger 是最流行的 API 开发工具,它遵循 OpenAPI Specification(OpenAPI 规范,也简称 OAS). Sw ...

  6. docker 部署jenkins + sonarqube + postgresql 代码扫描

    前言 docker部署 错误1 解决1: 问题2: 解决2: 配置sonarqube 先来安装一个汉化插件吧 问题3 整合Sonar和gitlab 安装Gitlab-runner,获取gitlab-T ...

  7. 使用Docker部署Spring-Boot-项目,带劲!

    Docker 一次构建.处处运行及快速启停的特性,在微服务架构中有着举足轻重的地位,具体的概念性的东西就不介绍了,不懂的点击这里阅读 Docker 基础教程. 本篇栈长主要介绍下如何通过 Intell ...

  8. docker部署微服务项目

    上次有人说部署单个springboot项目和ssm写的非常的简单可以写一篇docker部署微服务的结构的文章的吗 安排 什么是微服务? 微服务架构是一种将单个应用程序作为一套小型服务开发的方法,每种应 ...

  9. s19.基于 Kubernetes v1.25 (kubeadm) 和 Docker 部署高可用集群(一)

    基于 Kubernetes v1.25 和 Docker 部署高可用集群 主要内容 Kubernetes 集群架构组成 容器运行时 CRI Kubernetes v1.25 新特性 Kubernete ...

最新文章

  1. 整合资源_java的基础关键字
  2. mina与spring集成(翻译)
  3. 文件下载乱码问题分析与解决
  4. java 实现 pbkdf2_sha256加密验证算法
  5. css outline color,css outline-color属性怎么用
  6. Python 爬虫进阶二之 PySpider 框架安装配置
  7. 分析:windows下cmd默认的编码是ASCII编码 ,windows的中文环境下编码是GBK 方法一:在保存输出流保存的时候做一个对文字GBK编码,在输出到文件 如下 [python] view
  8. 行业指数动量策略+akshare
  9. Exchange Server 2010核心服务器角色介绍
  10. Java基础01 1个和2个区别比较
  11. python ui自动化脚本_ui自动化:python+appium----环境搭建
  12. linux中产生随机数函数,如何用C++产生随机数
  13. Windows 10 安装 scrapy 步骤
  14. bzoj 3110: [Zjoi2013]K大数查询(树套树)
  15. linux zk服务 关闭_linux上安装zookeeper 启动和关闭的教程
  16. 易语言取linux命令返回值,易语言返回命令使用讲解
  17. indows蓝屏PROCESS1_INITIALIZATION_FAILED STOP:0x0000006B 解决方法
  18. 家庭必备,轻、快、好用的WIN10自带虚拟机
  19. DMS/BSD/ADAS
  20. 使用QGIS制作专题地图——上海市游泳馆分布地图

热门文章

  1. system.err android.os.NetworkOnmainThreadException 错误解决办法
  2. Ubuntu 14.04 LTS, 64bit, cuda 7, Caffe环境配置编译和安装
  3. 基于统计概率和机器学习的文本分类技术
  4. 用命令行方式获取打包签名文件的SHA1和MD5
  5. c语言程序设计第3周编程作业(数字特征)
  6. Android NDK开发之旅14 JNI 缓存策略
  7. Linux之samba服务器的搭建及详解
  8. 互联网高并发架构技术实践
  9. Jetty9.2.2集群Session共享
  10. JQuery UI – droppable 中文文档