docker部署xxl-job 通用反射执行器
原因
最近在公司写一些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脚本
缺点
- xxl-job只支持mysql数据库,公司使用的Oracle 所以docker需要运行一个mysql数据库
- xxl-job截至2.0.2版本没有提供多用户及权限管理
转载于:https://www.cnblogs.com/ingxx/p/11274508.html
docker部署xxl-job 通用反射执行器相关推荐
- 手牵手教Docker部署Springboot+vue ,全过程十分详细,轻松完成项目部署(简单,高效,通用)
手把手教Docker部署Springboot+vue ,详细全过程,轻松完成项目部署(简单,高效) 上线前准备 腾讯云的服务器,服务器安装好docker 和docker-compose 最好事先了解技 ...
- Docker 部署SpringBoot项目不香吗?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:流星007 链接:toutiao.com/i68433912 ...
- ASP.NET Core微服务(七)——【docker部署linux上线】(RDS+API接口测试部分)
ASP.NET Core微服务(七)--[docker部署linux上线]: 本文测试采用阿里云的RDS(sqlserver服务器)+ECS(linux服務器)进行测试,由于是测试,[按量付费]买个最 ...
- 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 ...
- swagger入门和实践(含docker部署swagger)
全栈工程师开发手册 (作者:栾鹏) 架构系列文章 简介 Swagger 是最流行的 API 开发工具,它遵循 OpenAPI Specification(OpenAPI 规范,也简称 OAS). Sw ...
- docker 部署jenkins + sonarqube + postgresql 代码扫描
前言 docker部署 错误1 解决1: 问题2: 解决2: 配置sonarqube 先来安装一个汉化插件吧 问题3 整合Sonar和gitlab 安装Gitlab-runner,获取gitlab-T ...
- 使用Docker部署Spring-Boot-项目,带劲!
Docker 一次构建.处处运行及快速启停的特性,在微服务架构中有着举足轻重的地位,具体的概念性的东西就不介绍了,不懂的点击这里阅读 Docker 基础教程. 本篇栈长主要介绍下如何通过 Intell ...
- docker部署微服务项目
上次有人说部署单个springboot项目和ssm写的非常的简单可以写一篇docker部署微服务的结构的文章的吗 安排 什么是微服务? 微服务架构是一种将单个应用程序作为一套小型服务开发的方法,每种应 ...
- s19.基于 Kubernetes v1.25 (kubeadm) 和 Docker 部署高可用集群(一)
基于 Kubernetes v1.25 和 Docker 部署高可用集群 主要内容 Kubernetes 集群架构组成 容器运行时 CRI Kubernetes v1.25 新特性 Kubernete ...
最新文章
- 整合资源_java的基础关键字
- mina与spring集成(翻译)
- 文件下载乱码问题分析与解决
- java 实现 pbkdf2_sha256加密验证算法
- css outline color,css outline-color属性怎么用
- Python 爬虫进阶二之 PySpider 框架安装配置
- 分析:windows下cmd默认的编码是ASCII编码 ,windows的中文环境下编码是GBK 方法一:在保存输出流保存的时候做一个对文字GBK编码,在输出到文件 如下 [python] view
- 行业指数动量策略+akshare
- Exchange Server 2010核心服务器角色介绍
- Java基础01 1个和2个区别比较
- python ui自动化脚本_ui自动化:python+appium----环境搭建
- linux中产生随机数函数,如何用C++产生随机数
- Windows 10 安装 scrapy 步骤
- bzoj 3110: [Zjoi2013]K大数查询(树套树)
- linux zk服务 关闭_linux上安装zookeeper 启动和关闭的教程
- 易语言取linux命令返回值,易语言返回命令使用讲解
- indows蓝屏PROCESS1_INITIALIZATION_FAILED STOP:0x0000006B 解决方法
- 家庭必备,轻、快、好用的WIN10自带虚拟机
- DMS/BSD/ADAS
- 使用QGIS制作专题地图——上海市游泳馆分布地图
热门文章
- system.err android.os.NetworkOnmainThreadException 错误解决办法
- Ubuntu 14.04 LTS, 64bit, cuda 7, Caffe环境配置编译和安装
- 基于统计概率和机器学习的文本分类技术
- 用命令行方式获取打包签名文件的SHA1和MD5
- c语言程序设计第3周编程作业(数字特征)
- Android NDK开发之旅14 JNI 缓存策略
- Linux之samba服务器的搭建及详解
- 互联网高并发架构技术实践
- Jetty9.2.2集群Session共享
- JQuery UI – droppable 中文文档