网站制作培训费用,能源与动力工程,注册代理公司流程及费用,怎么做推广网站赌场#x1f353; 简介#xff1a;java系列技术分享(#x1f449;持续更新中…#x1f525;) #x1f353; 初衷:一起学习、一起进步、坚持不懈 #x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正#x1f64f; #x1f353; 希望这篇文章对你有所帮助,欢… 简介java系列技术分享(持续更新中…) 初衷:一起学习、一起进步、坚持不懈 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正 希望这篇文章对你有所帮助,欢迎点赞 收藏 ⭐留言 更多文章请点击 文章目录 前言一、 什么是XXL-JOB?二、XXL-JOB的调度中心搭建2.1 环境搭建2.2 配置部署调度中心2.2.1 本地启动2.2.2 docker启动 三、XXL-JOB使用3.1新建任务3.2 导入依赖3.3 application.yml配置3.4 创建配置类3.5 任务代码3.6 测试启动 四、执行器五、任务详解-基础配置六、路由策略(分片广播) 前言
spring传统的定时任务Scheduled但是这样存在这一些问题 做集群任务的重复执行问题 cron表达式定义在代码之中修改不方便 定时任务失败了无法重试也没有统计 如果任务量过大不能有效的分片执行
一、 什么是XXL-JOB?
文档地址https://www.xuxueli.com/xxl-job/ 源码地址https://gitee.com/xuxueli0323/xxl-job XXL-JOB是一个任务调度框架通过引入XXL-JOB相关的依赖按照相关格式撰写代码后可在其可视化界面进行任务的 启动执行中止 以及包含了 日志记录与查询 和 任务状态监控 二、XXL-JOB的调度中心搭建
2.1 环境搭建 下载官方源码 https://gitee.com/xuxueli0323/xxl-job 将项目中 xxl-job/doc/db/ 目录下的 tables_xxl_job.sql 的数据库表导入数据库 - xxl_job_lock任务调度锁表
- xxl_job_group执行器信息表维护任务执行器信息
- xxl_job_info调度扩展信息表 用于保存XXL-JOB调度任务的扩展信息如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等
- xxl_job_log调度日志表 用于保存XXL-JOB任务调度的历史信息如调度结果、执行结果、调度入参、调度机器和执行器等等
- xxl_job_logglue任务GLUE日志用于保存GLUE更新历史用于支持GLUE的版本回溯功能
- xxl_job_registry执行器注册表维护在线的执行器和调度中心机器地址信息
- xxl_job_user系统用户表2.2 配置部署调度中心
2.2.1 本地启动
调度中心项目xxl-job-admin
作用统一管理任务调度平台上调度任务负责触发调度执行并且提供任务管理平台。
修改调度中心配置文件地址/xxl-job/xxl-job-admin/src/main/resources/application.properties
数据库的连接信息修改为自己的数据库 启动调度中心访问地址http://127.0.0.1:8080/xxl-job-admin/ 默认登录账号 “admin/123456”, 登录后运行界面如下图所示。 2.2.2 docker启动
1.创建mysql容器初始化xxl-job的SQL脚本
docker run -p 3306:3306 --name mysql57 \
-v /opt/mysql/conf:/etc/mysql \
-v /opt/mysql/logs:/var/log/mysql \
-v /opt/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORDroot \
-d mysql:5.72.拉取镜像
docker pull xuxueli/xxl-job-admin:2.3.03.创建容器
docker run -e PARAMS--spring.datasource.urljdbc:mysql://192.168.200.130:3306/xxl_job?UnicodetruecharacterEncodingUTF-8 \
--spring.datasource.usernameroot \
--spring.datasource.passwordroot \
-p 8888:8080 -v /tmp:/data/applogs \
--name xxl-job-admin --restartalways -d xuxueli/xxl-job-admin:2.3.0三、XXL-JOB使用
3.1新建任务 登录调度中心点击下图所示“新建任务”按钮新建示例任务
3.2 导入依赖 !--xxl-job--dependencygroupIdcom.xuxueli/groupIdartifactIdxxl-job-core/artifactIdversion2.3.0/version/dependency3.3 application.yml配置
xxl:job:admin:addresses: http://127.0.0.1:8080/xxl-job-adminexecutor:appname: xxl-job-executor-sampleport: 9999解释如下:
3.4 创建配置类 注意 :新版本中accessToken参数必须填写,否则会报如下错误: egistryResult:ReturnT [code500, msgThe access token is wrong., contentnull] 其实在更早期的版本中这个参数不是必选项但是在最新的版本中考虑到安全性的问题token变成了默认选项在不修改调度中心的情况下执行器必须加上token。
package com.xing.config;import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;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.port})private int port;Value(${xxl.job.accessToken})private String accessToken;// Value(${xxl.job.executor.ip})
// private String ip;
////
// Value(${xxl.job.executor.logpath})
// private String logPath;
//
// Value(${xxl.job.executor.logretentiondays})
// private int logRetentionDays;Beanpublic XxlJobSpringExecutor xxlJobExecutor() {logger.info( xxl-job config init.初始化);XxlJobSpringExecutor xxlJobSpringExecutor new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appname);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);
// xxlJobSpringExecutor.setIp(ip);
// xxlJobSpringExecutor.setLogPath(logPath);
// xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}/*** 针对多网卡、容器内部署等情况可借助 spring-cloud-commons 提供的 InetUtils 组件灵活定制注册IP** 1、引入依赖* dependency* groupIdorg.springframework.cloud/groupId* artifactIdspring-cloud-commons/artifactId* version${version}/version* /dependency** 2、配置文件或者容器启动变量* spring.cloud.inetutils.preferred-networks: xxx.xxx.xxx.** 3、获取IP* String ip_ inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();*/
}3.5 任务代码
Component
public class HelloJob {XxlJob(demoJobHandler) public void helloJob(){System.out.println(简单任务执行了。。。。);}
}3.6 测试启动 四、执行器 执行器任务的绑定的执行器任务触发调度时将会自动发现注册成功的执行器, 实现任务自动发现功能; 另一方面也可以方便的进行任务分组。每个任务必须绑定一个执行器 以下是执行器的属性说明
属性名称说明AppName是每个执行器集群的唯一标示AppName, 执行器会周期性以AppName为对象进行自动注册。可通过该配置自动发现注册成功的执行器, 供任务调度时使用;名称执行器的名称, 因为AppName限制字母数字等组成,可读性不强, 名称为了提高执行器的可读性;排序执行器的排序, 系统中需要执行器的地方,如任务新增, 将会按照该排序读取可用的执行器列表;注册方式调度中心获取执行器地址的方式机器地址注册方式为手动录入时有效支持人工维护执行器的地址信息
自动注册和手动注册的区别和配置
五、任务详解-基础配置 基础配置 执行器每个任务必须绑定一个执行器, 方便给任务进行分组 任务描述任务的描述信息便于任务管理 负责人任务的负责人 报警邮件任务调度失败时邮件通知的邮箱地址支持配置多邮箱地址配置多个邮箱地址时用逗号分隔
调度配置
调度类型 无该类型不会主动触发调度CRON该类型将会通过CRON触发任务调度固定速度该类型将会以固定速度触发任务调度按照固定的间隔时间周期性触发
任务配置 运行模式BEAN模式任务以JobHandler方式维护在执行器端需要结合 “JobHandler” 属性匹配执行器中任务 JobHandler运行模式为 “BEAN模式” 时生效对应执行器中新开发的JobHandler类“JobHandler”注解自定义的value值 执行参数任务执行所需的参数
阻塞处理策略
阻塞处理策略调度过于密集执行器来不及处理时的处理策略 单机串行默认调度请求进入单机执行器后调度请求进入FIFO(First Input First Output)队列并以串行方式运行 丢弃后续调度调度请求进入单机执行器后发现执行器存在运行的调度任务本次请求将会被丢弃并标记为失败 覆盖之前调度调度请求进入单机执行器后发现执行器存在运行的调度任务将会终止运行中的调度任务并清空队列然后运行本地调度任务
路由策略
当执行器集群部署时提供丰富的路由策略包括 FIRST第一个固定选择第一个机器 LAST最后一个固定选择最后一个机器 ROUND轮询 RANDOM随机随机选择在线的机器 CONSISTENT_HASH一致性HASH每个任务按照Hash算法固定选择某一台机器且所有任务均匀散列在不同机器上。 LEAST_FREQUENTLY_USED最不经常使用使用频率最低的机器优先被选举 LEAST_RECENTLY_USED最近最久未使用最久未使用的机器优先被选举 FAILOVER故障转移按照顺序依次进行心跳检测第一个心跳检测成功的机器选定为目标执行器并发起调度 BUSYOVER忙碌转移按照顺序依次进行空闲检测第一个空闲检测成功的机器选定为目标执行器并发起调度 SHARDING_BROADCAST(分片广播)广播触发对应集群中所有机器执行一次任务同时系统自动传递分片参数可根据分片参数开发分片任务
六、路由策略(分片广播) 执行器集群部署时任务路由策略选择”分片广播”情况下一次任务调度将会广播触发对应集群中所有执行器执行一次任务 修改yml配置
server:port: ${port:8881}xxl:job:admin:addresses: http://127.0.0.1:8080/xxl-job-adminexecutor:appname: xxl-job-sharding-executorport: ${executor.port:9999}代码 分片参数 index当前分片序号(从0开始)执行器集群列表中当前执行器的序号 total总分片数执行器集群的总机器数量 Component
public class HelloJob {Value(${server.port})private String port;XxlJob(demoJobHandler)public void helloJob(){System.out.println(简单任务执行了。。。。port);}XxlJob(shardingJobHandler)public void shardingJobHandler(){//分片的参数int shardIndex XxlJobHelper.getShardIndex();int shardTotal XxlJobHelper.getShardTotal();//业务逻辑ListInteger list getList();for (Integer integer : list) {if(integer % shardTotal shardIndex){System.out.println(当前第shardIndex分片执行了任务项为integer);}}}public ListInteger getList(){ListInteger list new ArrayList();for (int i 0; i 10000; i) {list.add(i);}return list;}
}