做程序员招聘的网站/微商引流一般用什么软件
XXL-JOB分布式任务调度
在实际项目中,为了降低耦合,通常会把定时任务的逻辑单独抽离出来,构建成一个新的工程。也有可能需要定时任务实现高可用,组建成集群,提高容错率。
那么问题也就来了。既然定时任务是多个节点,那么同一时间多个节点都执行,必然造成数据重复,如何保证只有一个节点执行任务就是一个很重要的问题。
原生定时任务的缺陷
使用过原生定时任务的开发者应该深有感触,原生定时任务仅能满足简单的需求,应对复杂的场景还有一定的缺陷。如以下的一些不足之处:
- 不支持集群、不能高可用:若部署多节点,必定会数据重复。单节点宕机时,服务将不可用
- 不支持任务失败重试:任务出现异常时将自动终结
- 不支持执行时间的动态调整:服务一旦启动,若调整时间则需要修改代码,重启服务
- 无报警机制:任务失败时,没有报警机制(邮件通知等)
- 无任务数据统计信息:比如执行任务数,成功比例、失败比例等数据
- 不支持对任务生命周期的统一管理:在不对服务进程操作情况下,无法手动实现对任务的开启或关闭操作
- 不支持分片任务:不能多节点处理不同内容
XXL-JOB介绍
上面介绍了原生定时任务的缺陷,而XXL-JOB
几乎能完美解决这些问题。XXL-JOB是一款开源免费的分布式任务调度框架,学习成本低,易扩展,依赖组件少,仅需要基础Java环境和Mysql数据库就可以使用,开箱即用。
XXL-JOB设计简单实用:
- 提供可视化界面,统计任务数据和操作任务的开始或停止,无需重启服务
- 动态修改任务执行时间(corn表达式)
- 内置支持邮件警报(也可扩展其他的警报)
- 支持任务分片和任务失败重试
- 支持父任务执行结束且执行成功后,将主动触发一次子任务的执行
注意:要增加其他的报警时,需要新增类并且实现com.xxl.job.admin.core.alarm.JobAlarm接口,并把对象交给spring管理。具体规则可参考com.xxl.job.admin.core.alarm.impl.EmaiJobAlarm类
XXL-JOB将分布式任务系统分为两个模块:调度中心
和执行器
。
调度中心本身不承担业务逻辑,而是主要向执行器发送调度请求。执行器则负责接收调度中心的请求并且执行真正的业务逻辑。这样将任务调度和执行过程高度解耦,更容易实现集群。
XXL-JOB使用
XXL-JOB在github或gitee上都可以找到相关的源码:
- github:https://github.com/xuxueli/xxl-job/releases
- gitee:https://gitee.com/xuxueli0323/xxl-job
笔者这里使用2.2.0
版本,下载zip或tar.gz压缩包,解压完成后即可得到源码。
准备数据库表
作者已经准备了数据表,我们只需要导入到Mysql中即可。
导入后数据库如下图
8张表:
- xxl_job_lock:任务调度锁表
- xxl_job_group:执行器信息表
- xxl_job_info:保存xxl-job调度任务的扩展信息表
- xxl_job_log:日志
- xxl_job_log_report:调度日志报表
- xxl_job_logglue:GLUE更新历史
- xxl_job_registry:执行器列表
- xxl_job_user:系统管理员表
使用IDEA导入源码
导入源码后发现主要有三个模块:
- xxl-job-admin:调度中心
- xxl-job-core:公共依赖
- xxl-job-executor-sample:执行器示例
执行器示例中有很多版本,如SpringBoot、Spring、无框架、JFinal、JBoot等提供用户参考构建自己的执行器。
到xxl-job-admin
项目的application.properties
文件,修改数据库信息及Email配置:
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxxxx@qq.com
# 授权码,自行获取
spring.mail.password=xxxxxxxxxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory### xxl-job, access token
xxl.job.accessToken=
spring.mail.password
的配置项的SMTP密码需要单独申请,非邮箱登录的密码。若不需要邮件报警,那么关于Email的配置不用修改。
xxl.job.accessToken
若服务端设置了这个,那么它的客户端也要去设置这个token.
配置完成后,可以运行主类XxlJobAdminApplication
启动服务。启动完成后,使用浏览器访问http://localhost:8080/xxl-job-admin,输入账号admin密码123456,登录进入运行报表界面。
Docker方式搭建调度中心
除了使用源码运行外,还可以用Docker方式一键搞定。
docker run -e PARAMS="--spring.datasource.username=root --spring.datasource.password=123456 --spring.datasource.url=jdbc:mysql://ip:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimeZone=Asia/Shanghai" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin -d xuxueli/xxl-job-admin:2.2.0
- -e:配置参数
- -p:宿主机和容器端口映射
- -v:挂载目录
- –name:容器名称
- -d:后台运行
创建一个执行器项目
- 创建一个SpringBoot项目,导入相关的依赖:
<!--xxl-job依赖-->
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.2.0</version>
</dependency>
- 修改application.yml配置文件,主要加入调度中心地址、执行器名称、访问token、执行器的服务地址、日志路径、日志保留天数等配置
server:port: 8002
spring:application:name: user # 应用名cloud:nacos:discovery:server-addr: localhost:8848 # nacos服务地址
xxl:job:admin:adresses: http://localhost:8080/xxl-job-adminaccessToken: #若服务端设置了,那么这里需要和服务端的值保持一致executor:appname: xxl-job-executor-sampleaddress: # 执行器地址,默认使用 xxl.job.executor.address配置项,若为空,则使用xxl.job.executor.ip + xxl.job.executor.port配置ip: # 执行器ipport: 9989 # 执行器端口logpath: D:\logs # 日志保存路径logretentiondays: 30 # 日志保留天数
在服务器是多网卡的情况下,自动获取的地址可能不对,这时候xxl.job.executor.address
或xxl.job.executor.ip
就派上用场了,手动设定地址。
- 创建XxlJobConfig配置类,根据applicaiton.yml的配置参数,初始化执行器
@Configuration
public class XxlJobConfig {@Value("${xxl.job.admin.addresses}")private String adminAddresses; // 调度中心地址@Value("${xxl.job.admin.accessToken}")private String accessToken; // 通信token@Value("${xxl.job.admin.executor.appname}")private String appName; // 执行器名称@Value("${xxl.job.admin.executor.address}")private String address; // 地址 @Value("${xxl.job.admin.executor.ip}")private String ip; // ip @Value("${xxl.job.admin.executor.port}")private int port; // 端口@Value("${xxl.job.admin.executor.logpath}")private String logPath; // 日志地址 @Value("${xxl.job.admin.executor.logretentiondays}")private int logRetentionDays; // 日志保留天数@Beanpublic XxlJobSpringExecutor xxlJobSpringExecutor() {XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appName);xxlJobSpringExecutor.setAddress(address);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}
}
配置完成后,就可以启动执行器。然后来到调度中心的后台管理页面,点击执行器管理,如图所示
注意:如果注册方式是自动注册,会有心跳机制,OnLine机器地址列表服务自动上上线、下线。若是手动录入,则不会有心跳机制,而会一直存在OnLine机器的地址列表中。
第一个GLUE(Java)任务
目前已经有一个执行器了,下面使用GLUE模式创建一个定时任务。
注意:GLUE模式的执行代码托管到调度中心在线维护,相比Bean模式更加轻量化,但是发杂业务不建议使用GLUE模式。
- 在调度中心管理后台点击任务管理,然后新增,填入相关的信息:
路由策略:表示使用什么样的策略选出当前下拉框选择的执行器具体由哪个执行器执行任务(若是分片广播,那就是当前下拉框选择的执行器下全部执行器都执行)。
- 添加完任务后,可以修改此任务的代码,点击右侧的图标,点击GLUE IDE在线编辑代码。
点击执行一次。XXL-JOB提供了手动触发执行一次任务的功能,必须等到设定的时间到达。
点击后,出现任务参数和机器地址的输入框(可不填),点击保存
即可。
若想定时任务按照设定的时间执行,需要将那条任务设置为启动
调度日志
中可以看到执行的日志信息。
- 若遇到任务调度失败,将会发邮件,信息如下
BEAN模式普通任务
前面使用的是GLUE(java)模式实现的定时任务,但是面对负责的业务逻辑时肯定不行的。所以使用BEAN模式实现普通定时任务。
- 新建任务类TestJobHandler,添加sampleJobHandler方法,并使用@XxlJob注解声明
@Component
public class TestJobHandler {@XxlJob("sampleJobHandler")public ReturnT<String> sampleJobHandler(String name) {XxlJobLogger.log("sampleJobHandler, hello World.");return ReturnT.SUCCESS;}
}
启动执行器
XXL-JOB2.2.0版本移除了@JobHandler注解,推荐使用基于方法的@XxlJob注解进行任务开发。
- 在调度中心后台,新增任务
- 执行
执行器集群和BEAN模式分片任务
分片任务适用于数据量较大的场景,采用分而治之的思想,尽量把任务均摊到每个节点,减少单个节点的压力。
例如有这样一个业务:每天固定一个时间生成代理用户的报表,考虑到代理比较多,计算数据的过程比较复杂时,使用分片任务。
- 编写分片任务的代码,使用List数据结构模拟代理数据
@XxlJob("shardingJobHandler")
public ReturnT<String> shardingJobHandler(String param) {// 分片任务ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();// 分片参数XxlJobLogger.log("分片参数:当前序号 = {},总分片数:= {}", shardingVO.getIndex(), shardingVO.getTotal());for (Integer val : agentList) {if (val % shardingVO.getTotal() == shardingVO.getIndex()) { // 取余处理XxlJobLogger.log("第{}片,命中分片开始处理 {} ", shardingVO.getIndex(), val);// 其他的业务逻辑}}return ReturnT.SUCCESS;
}
ShardingVO中有两个属性:
-
index:当前分片索引(0开始)
-
total:总分片数
-
若使用分片任务,那么自然是需要2个节点以上的执行器才可以。复制一份执行器,改下端口即可
server.port
和xxl.job.executor.port
,然后启动它们。 -
在调度中心后台增加分片任务
- 执行一次,看日志
第一个分片
第二个分片
看出总6条代理数据,2个执行器执行的任务是均匀的,分片执行任务成功。
调度中心和执行器的集群
若有多个调度中心,那么需要在执行器的配置中:
addresses
多个地址时,使用,
分隔
xxl:job:admin:addresses: http://localhost:8080/xxl-job-admin,http://localhost:8081/xxl-job-adminaccessToken:executor:appname: xxl-job-executor-sampleaddress: # 执行器地址,默认使用 xxl.job.executor.address配置项,若为空,则使用xxl.job.executor.ip + xxl.job.executor.port配置ip: # 执行器ipport: 9999 # 执行器端口logpath: D:\logs # 日志保存路径logretentiondays: 30 # 日志保留天数
同样也可以使用Nginx负载均衡,为多个调度中心设置调度分配
upstream XXLJOB {server 127.0.0.1:8080;server 127.0.0.1:8081;}server {listen 8002;server_name localhost;location / {proxy_pass http://XXLJOB;}
}
执行器就可以这样配置
xxl:job:admin:addresses: http://localhost:8002/xxl-job-admin
相关文章:

XXL-JOB分布式任务调度
XXL-JOB分布式任务调度 在实际项目中,为了降低耦合,通常会把定时任务的逻辑单独抽离出来,构建成一个新的工程。也有可能需要定时任务实现高可用,组建成集群,提高容错率。 那么问题也就来了。既然定时任务是多个…...

加拿大人工智能数据搜索平台【Secoda】完成1400万美元A轮融资
来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,总部位于加拿大多伦多的人工智能数据搜索平台【Secoda】今日宣布已完成1400万美元A轮融资。 本轮融资由Craft Ventures领投,参与投资的投资机构有Abstract Ventures、现有投资者YCombi…...

less与sass
1.变量: Less: my-color: #ff0000;.container {background-color: my-color; } Sass:$my-color: #ff0000;.container {background-color: $my-color; } 在这点上,Less和Sass的变量概念基本相同,都是以声明的方式存储值,然后在…...

已解决: Go Error: no Go files in /path/to/directory问题
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页: 🐅🐾猫头虎的博客🎐《面试题大全专栏》 🦕 文章图文并茂🦖…...

2022年6月和7月的工作经历
6月 3D打标软件 3D打标软件,要求在Open3d上加几个2D文字。大致有如下几个方案: 依葫芦画瓢,但O3DVisualizer派生于gui::Window,我的程序派生于Visualizer。工作量不小。 利用OpenGL输出文字,Baidu的两种方法一个编…...

【图像处理】SIFT角点特征提取原理
一、说明 提起在OpenCV中的特征点提取,可以列出Harris,可以使用SIFT算法或SURF算法来检测图像中的角特征点。本篇围绕sift的特征点提取,只是管中窥豹,而更多的特征点算法有: Harris & Stephens / Shi–Tomasi 角点…...

flutter开发实战-应用更新apk下载、安装apk、启动应用实现
flutter开发实战-应用更新apk下载、安装apk、启动应用实现 在开发过程中,经常遇到需要更新下载新版本的apk文件,之后进行应用更新apk下载、安装apk、启动应用。我们在flutter工程中实现下载apk,判断当前版本与需要更新安装的版本进行比对判断…...

DispatcherServlet初始化之Spring容器创建1.0
一、前言 在SpringMVC框架中,DispatcherServlet扮演着非常重要的角色,它负责接收所有的HTTP请求并将其分发给相应的处理器。在DispatcherServlet的初始化过程中,会创建一个Spring容器来管理应用程序中的Bean。 二、步骤 1、加载配置文件&a…...

CSS的基础
CSS美化HTML,布局网页 CSS最大的价值:由HTML专注去做结构呈现,样式给CSS,结构(HTML)与样式(CSS)相分离 CSS主要由选择器以及一条或多条声明 在<head></head>中实现CSS在<body…...

mathtype如何嵌入到word中?详细mathtype安装步骤教程
mathtype是一款功能特别强大的数学方式编辑软件,为用户提供各种强大的数学公式符号帮助用户进行计算,并且速度很快。有小伙伴知道mathtype如何嵌入到word中吗,这里小编就给大家详细介绍一下mathtype嵌入到word中的方法,有需要的小…...

云安全之访问控制的常见攻击及防御
访问控制攻击概述 访问控制漏洞即应用程序允许攻击者执行或者访问某种攻击者不具备相应权限的功能或资源。 常见的访问控制可以分为垂直访问控制、水平访问控制及多阶段访问控制 (上下文相关访问控制),与其相应的访问控制漏洞为也垂直越权漏洞(普通用户可以访问或…...

Java编程技巧:跨域
目录 1、跨域概念2、后端CORS(跨域资源共享)配置原理3、既然请求跨域了,那么请求到底发出去没有?4、通过后端CORS(跨域资源共享)配置解决跨域问题代码4.1、SpringBoot(FilterRegistrationBean&a…...

react create-react-app 配置less
环境信息: create-react-app:v5 react:18.2.0 node:18.16.0 如果你不必须使用 less 建议直接使用scss。 因为less配置会遇到很多问题。 配置less过程: 如果你只需要 sass的话,就可以直接使用sass。因为默认配置了scss。 npm、yarn、cnpm、…...

树的表示——孩子兄弟表示法
从图中可以看出,树的每个结点,都有不确定的指向他们的孩子的节点,如果我们定义这样一个结构体来便是数的结构的话: struct TreeNode { int val; struct TreeNodep1; struct TreeNodep1; … }; 是不能够表示一棵树的,因…...

Windows11安装MySQL8.1
安装过程中遇到任何问题均可以参考(这个博客只是单纯升级个版本和简化流程) Windows安装MySQL8教程-CSDN博客 到官网下载mysql8数据库软件 MySQL :: Download MySQL Community Server 下载完后,解压到你需要安装的文件夹 其中的配置文件内容了如下 [mysqld]# 设置3306端口po…...

Linux编程——经典链表list_head
1. 关于list_head struct list_head是Linux内核定义的双向链表,包含一个指向前驱节点和后继节点的指针的结构体。其定义如下: struct list_head {struct list_head *next, *prev; //双向链表,指向节点的指针 };1.1 链表的定义和初始化 有两…...

基于51单片机NEC协议红外遥控发送接收仿真设计( proteus仿真+程序+原理图+报告+讲解视频)
基于51单片机NEC协议红外遥控发送接收仿真设计 讲解视频1.主要功能:2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&&下载链接 基于51单片机NEC协议红外遥控发送接收仿真设计 51单片机红外发送接收仿真设计( proteus仿真程序原理图报告讲解视频…...

Jmeter分布式压力测试
目录 1、场景 2、原理 3、注意事项 4、slave配置 5、master配置 6、脚本执行 1、场景 在做性能测试时,单台机器进行压测可能达不到预期结果。主要原因是单台机器压到一定程度会出现瓶颈。也有可能单机网卡跟不上造成结果偏差较大。 例如4C8G的window server机…...

Rust :mod.rs和lib.rs中use的作用
一、mod.rs和lib.rs mod.rs往往是把同一目录下的n个rs文件综合在一起的有效方式; lib.rs是一个库或子库层次综合在一起的有效方式; 下面举个实例来说明。生成一个rusttoc本地库(由cargo new rusttoc --lib所生成),目录…...

ISP图像信号处理——平场校正介绍以及C++实现
参考文章1:http://t.csdn.cn/h8TBy 参考文章2:http://t.csdn.cn/6nmsT 参考网址3:opencv平场定标 - CSDN文库 平场校正一般先用FPN(Fixed Pattern Noise)固定图像噪声校正,即暗场校正;再用PRNU(Photo Response Non Uniformity)…...

【深入了解Java String类】
目录 String类 常用方法 字符串的不可变性 String的内存分析 StringBuilder类 解释可变和不可变字符串 常用方法 面试题:String,StringBuilder,StringBuffer之间的区别和联系 String类的OJ练习 String类 【1】直接使用,…...

基于SpringBoot的知识管理系统
目录 前言 一、技术栈 二、系统功能介绍 用户管理 文章分类 资料分类 文章信息 论坛交流 资料下载 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息互联网信息的飞速发展,无纸化作业变成了一种趋势,针对这个问题开发一个…...

Pytorch基础:Tensor的reshape方法
在Pytorch中,reshape是Tensor的一个重要方法,它与Numpy中的reshape类似,用于返回一个改变了形状但数据和数据顺序和原来一致的新Tensor对象。注意:此时返回的数据对象并不一定是新的,这取决于应用此方法的Tensor是否是…...

【数据库——MySQL】(13)过程式对象程序设计——存储函数、错误处理以及事务管理
目录 1. 存储函数2. 存储函数的应用3. 错误处理4. 抛出异常5. 事务处理6. 事务隔离级7. 应用实例参考书籍 1. 存储函数 要 创建 存储函数,需要用到 CREATE 语句: CREATE FUNCTION 存储函数名([参数名 类型, ...])RETURNS 类型[存储函数体]注意࿱…...

Spring Boot的魔法:构建高性能Java应用
文章目录 Spring Boot:简化Java开发Spring Boot的性能优势1. 内嵌服务器2. 自动配置3. 起步依赖4. 缓存和优化5. 异步处理 实际示例:构建高性能的RESTful API总结 🎉欢迎来到架构设计专栏~Spring Boot的魔法:构建高性能Java应用 ☆…...

如何做好测试?(七)兼容性测试 (Compatibility Testing, CT)
1. 兼容性测试介绍 兼容性测试 (Compatibility Testing, CT)是一种软件测试方法,旨在验证应用程序在不同操作系统、浏览器、设备和网络环境下的正确运行和一致性。对于网上购物系统来说,兼容性测试非常重要,因为用户可能使用各种不同的设备和…...

经典循环神经网络(一)RNN及其在歌词数据集上的应用
经典循环神经网络(一)RNN及其在歌词数据集上的应用 1 RNN概述 在深度学习兴起之前,NLP领域一直是统计模型的天下,例如词对齐算法GIZA,统计机器翻译开源框架MOSES等等。在语言模型方向,n-gram是当时最为流行的语言模型方法。n-gr…...

docker+mysql+flask+redis+vue3+uwsgi+docker部署
首先拉取mysql的镜像,这里用的mysql5.7.6 docker pull mysql:5.7.6 镜像拉取完成后启动: docker run --name my-mysql -d -p 3306:3306 -v /usr/local/my-mysql/conf:/etc/mysql/conf.d -v /usr/local/my-mysql/data:/var/lib/mysql -e MYSQL_ROOT_PA…...

Spring boot接收zip包并获取其中excel文件的方法
1、问题 工作中遇到一个需求,接收一个zip包,读取其中的excel文件并处理,减少用户多次选择目录和文件的痛点,该zip包包含多级目录 2、依赖 需要用到apache的Workbook类来操作Excel,引入以下依赖 <dependency>&l…...