【Java】SpringBoot整合xxl-job学习使用详解

文章目录

      • 介绍
      • 作用
      • 如何使用
        • 下载项目
        • 中央仓库地址
        • 环境
        • 调度中心
          • 初始化“调度数据库”
          • 配置部署“调度中心”
          • 部署项目
          • 调度中心集群(可选)
          • 其他:Docker 镜像方式搭建调度中心
          • 配置部署“执行器项目”
        • 执行器
          • maven依赖
          • 执行器配置
          • 执行器组件配置
          • 执行器集群(可选)
        • 执行效果
          • 编写业务代码
          • 新建调度规则
          • 启动一次
          • 启动
        • 细说策略
          • 路由策略
        • 总结
        • 总结

介绍

Xxl-Job是一款优秀的开源调度平台,用于管理和调度各种类型的任务,报告定时任务、分布式任务。

作用

分布式任务调度:XXL-JOB允许您在分布式环境中调度任务,这些任务可以在不同的节点上执行。它通过分布式协调和管理任务的执行,确保任务按计划运行。

Web界面:XXL-JOB提供了一个易于使用的Web界面,用于管理任务、查看任务执行日志、监控任务状态等。用户可以通过Web界面方便地创建、编辑和删除任务。

任务类型:XXL-JOB支持多种任务类型,包括定时任务(Cron表达式)、Bean任务(Java类方法)、分片任务(适用于数据分片处理)、流程任务(执行多个任务步骤的工作流程)等。

动态任务调度:XXL-JOB允许在运行时动态添加、修改和删除任务,而无需停止整个应用程序。这使得任务调度非常灵活。

任务依赖关系:您可以定义任务之间的依赖关系,确保某个任务在另一个任务成功执行后才能运行。

任务执行器:任务可以在不同的执行器上运行,例如Java、Shell、Python等。这样可以根据任务的类型和需求选择合适的执行器。

分片任务支持:XXL-JOB提供了分片任务的支持,允许将大任务分成多个小任务,每个小任务在不同的节点上并行执行,从而提高任务的执行效率。

任务日志:任务执行的日志可以在Web界面中查看,帮助用户跟踪任务的执行情况,排查问题。

报警和通知:XXL-JOB支持任务执行失败时发送报警通知,以及成功或失败后发送通知邮件。

权限管理:XXL-JOB提供了角色和权限管理功能,可以限制用户对任务调度的访问和操作。

历史任务记录:平台会保留任务执行的历史记录,用户可以随时查看历史任务的状态和日志。

集成和扩展性:XXL-JOB可以与Spring、Spring Boot、Quartz等框架集成,并提供了RESTful API,以便与其他系统进行集成。

高可用性和容错性:XXL-JOB的分布式架构支持高可用性和容错性,当某个节点出现故障时,任务可以在其他可用节点上执行。

开源和社区支持:XXL-JOB是一个开源项目,拥有活跃的社区支持,用户可以参与贡献和获取帮助。

如何使用

下载项目

可以科学上网的可以去github上clone项目,我这里是用的国内的码云进行下载项目。

我们可以从目录结构可以看出有以下三个项目子模块。

xxl-job-admin: 这个是xxl-job调度中心,这里我们不得不提一下,xxl-job其实本质是一个调度中心+执行器组成的一个框架。xxl-job本身不关注具体业务,它只负责调度。执行器启动之后要注册到调度中心,由调度中心配置具体的动作最后通信到指定的执行器上去执行具体的Handler。所以这里我们得把xxl-job-admin项目配置好启动起来,相当于一个中台了。

xxl-job-core: 这个应该就是xxl-job的核心源码,后续直接使用依赖直接注入就可以。要么你也可以打包,maven中央仓库应该有这个打包好的。

xxl-job-executor-samples:这个是xxl-job的执行样例,可以看这个上面的例子来实践,告诉你客户端的具体代码如何去写,然后调度中心就可以执行到具体的业务代码上。

中央仓库地址
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>${最新稳定版本}</version>
</dependency>

这里是用的最新的2.4.0

环境
  • Maven3+
  • Jdk1.8+
  • Mysql5.7+
调度中心
初始化“调度数据库”

请下载项目源码并解压,获取 “调度数据库初始化SQL脚本” 并执行即可。

“调度数据库初始化SQL脚本” 位置为:

/xxl-job/doc/db/tables_xxl_job.sql

调度中心支持集群部署,集群情况下各节点务必连接同一个mysql实例;

如果mysql做主从,调度中心集群节点务必强制走主库;

在这里插入图片描述

配置部署“调度中心”

调度中心配置文件地址:

/xxl-job/xxl-job-admin/src/main/resources/application.properties

调度中心配置内容说明:

### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致
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=root_pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
### 报警邮箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
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
### 调度中心通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 调度中心国际化配置 [必填]: 默认为 "zh_CN"/中文简体, 可选范围为 "zh_CN"/中文简体, "zh_TC"/中文繁体 and "en"/英文;
xxl.job.i18n=zh_CN
## 调度线程池最大线程配置【必填】
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### 调度中心日志表数据保存天数 [必填]:过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能;
xxl.job.logretentiondays=30
部署项目

如果已经正确进行上述配置,可将项目编译打包部署。

调度中心访问地址:http://localhost:8080/xxl-job-admin (该地址执行器将会使用到,作为回调地址)

默认登录账号 “admin/123456”, 登录后运行界面如下图所示。

在这里插入图片描述
在这里插入图片描述

到这一步之后,调度中心的环节算是成功了,后面可以直接去看执行器部分也是可以的。

调度中心集群(可选)

调度中心支持集群部署,提升调度系统容灾和可用性。

调度中心集群部署时,几点要求和建议:

  • DB配置保持一致;
  • 集群机器时钟保持一致(单机集群忽视);
  • 建议:推荐通过nginx为调度中心集群做负载均衡,分配域名。调度中心访问、执行器回调配置、调用API服务等操作均通过该域名进行。
其他:Docker 镜像方式搭建调度中心
  • 下载镜像
// Docker地址:https://hub.docker.com/r/xuxueli/xxl-job-admin/     (建议指定版本号)docker pull xuxueli/xxl-job-admin
  • 创建容器并运行
docker run -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin  -d xuxueli/xxl-job-admin:{指定版本}
/**
* 如需自定义 mysql 等配置,可通过 "-e PARAMS" 指定,参数格式 PARAMS="--key=value  --key2=value2" ;
* 配置项参考文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties
* 如需自定义 JVM内存参数 等配置,可通过 "-e JAVA_OPTS" 指定,参数格式 JAVA_OPTS="-Xmx512m" ;
*/
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1: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:{指定版本}
配置部署“执行器项目”
“执行器”项目:xxl-job-executor-sample-springboot (提供多种版本执行器供选择,现以 springboot 版本为例,可直接使用,也可以参考其并将现有项目改造成执行器)
作用:负责接收“调度中心”的调度并执行;可直接部署执行器,也可以将执行器集成到现有业务项目中。
执行器

这个执行器其实就是咋们自己的项目了,你的定时任务逻辑所在的Project。这里我要说明以下调度中心和执行器的关系有点类似Nacos微服务之间的关系。如果大家知道Nacos注册中心的话大概可以去那么理解,各个微服务启动之后都会把自己注册到Nacos中去,由Nacos统一来发现调度。

maven依赖

确认pom文件中引入了 “xxl-job-core” 的maven依赖;

<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.4.0</version>
</dependency>
执行器配置

执行器配置,配置文件地址:

/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties

执行器配置,配置内容说明:

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

yml如下配置

xxl:job:admin:addresses: http://127.0.0.1:8080/xxl-job-adminaccessToken: default_tokenexecutor:address:appname: xxl-job-executor-sampleip:port: 9999logpath: /data/applogs/xxl-job/jobhandlerlogretentiondays: 30
执行器组件配置

执行器组件,配置文件地址:

/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java

参照XxlJobConfig 复制内容到自己的执行器中。

private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${xxl.job.executor.appname}")private String appname;@Value("${xxl.job.executor.address}")private String address;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@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.setAddress(address);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}
执行器集群(可选)

执行器支持集群部署,提升调度系统可用性,同时提升任务处理能力。

执行器集群部署时,几点要求和建议:

  • 执行器回调地址(xxl.job.admin.addresses)需要保持一致;执行器根据该配置进行执行器自动注册等操作。
  • 同一个执行器集群内AppName(xxl.job.executor.appname)需要保持一致;调度中心根据该配置动态发现不同集群的在线执行器列表。

最终启动执行器的项目看以下是否成功。

在看以下调度中心上的执行器管理中,是否成功注册。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

执行效果

有人执行到这里就开始纳闷了,那我这也注册了啊,我怎么通过这些东西去执行我想要的东西呢?我们到这一步先捋一下思路,思考一下我们完成了什么。我们弄了一个调度中心,就是一个管家,然后启动了一个执行器的项目,一个马仔,并且呢这个马仔还跟管家联系上了。还没完成的是要执行任务的业务代码好像还没写,写哪里呢?又应该怎么调用执行呢?如果有些小伙伴仔细看了xxl-job的那三个子模块,很快就会发现,其实我们平时写的定时任务的业务代码它写在了执行器里,不难理解,我们通过调度中心这个管家可以随意配置一些调度信息,去管理那些马仔也就是执行器,而调度中心并不去关注具体业务逻辑是什么,它关注的是如何调度。

编写业务代码
@Component
public class TestJobTask {/*** 睡觉通知*/@XxlJob("sleepNotice")public void sleepNotice() {System.out.println("开始睡觉啦......");try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("醒啦........");}
}

这里我们要注意,要使用xxl-job中的一个注解@XxlJob,后续调度中心会根据注解里的值来找到对应的Handler,并执行里面的业务代码。

新建调度规则

在这里插入图片描述
在这里插入图片描述

启动一次

有时候我们的业务场景经常会是这样,定时任务比如每2小时一次,但是呢我们希望是部署成功后,先立马执行一次。这里我们就可以选择执行一次的按钮,先执行一次任务。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

启动

这个是让任务按照设置的Cron表达式定时启动。这里是每3秒执行一次。

在这里插入图片描述
在这里插入图片描述

细说策略
路由策略

在这里插入图片描述

第一个:总是第一个执行。比如一个任务量很大,要三个实例同时运行,但是总是只有第一个去执行。

最后一个:总是最后一个执行。跟上面那个相反。

轮询:三个实例注册到调度中心,调度中心公平的每个都平均执行过去,所谓雨露均沾,大家都有份。

随机:这个跟轮询就相反了,大家看运气了,老天爷赏饭吃。

分片广播:这个是整个策略里重点的东西,干货的玩意。大家可以搜索度娘搜索一下相关资料,类似于可以分布式计算,比如1000W数据量的任务,利用分片广播,可以让各个注册成功的实例,去拿到对应区段的数据,互不干扰,相当于1000W的数据被切成3个通道,每个通道里只消化自己通道里的数据,这样效率就成倍提高了。其实底层原理就是执行器注册到调度中心之后,调度中心给每个执行器都分给他们2个参数,一个是机子的总数,一个是当前机子的索引数。说白了就是你家有兄弟姐妹四人,你出去逢人就说起家里人的时候,你起码得知道2个信息,一个是你爸生了四个孩子,你排第几。这2个信息你肯定是知道的,总不能说你连你爸生几个你都不知道,那还玩个毛线,如果这样的话,那么数据量有部分就无法被消费掉或者执行掉。这里面有一个很经常用到的一个概念,就是Mod,取余的方式,可以度娘搜一下。

总结

以上就是我根据xxl-job官网的中文文档配合自己的实操写出来的体会,大家可以蛮看看,如果你经常用SpringTask的话对这个应该很快就能上手,因为我感觉它就是为了解决当初SpringTask那些轻量级定时框架留下的问题,做的一个比较全面的解决方案。

其实底层原理就是执行器注册到调度中心之后,调度中心给每个执行器都分给他们2个参数,一个是机子的总数,一个是当前机子的索引数。说白了就是你家有兄弟姐妹四人,你出去逢人就说起家里人的时候,你起码得知道2个信息,一个是你爸生了四个孩子,你排第几。这2个信息你肯定是知道的,总不能说你连你爸生几个你都不知道,那还玩个毛线,如果这样的话,那么数据量有部分就无法被消费掉或者执行掉。这里面有一个很经常用到的一个概念,就是Mod,取余的方式,可以度娘搜一下。

总结

以上就是我根据xxl-job官网的中文文档配合自己的实操写出来的体会,大家可以蛮看看,如果你经常用SpringTask的话对这个应该很快就能上手,因为我感觉它就是为了解决当初SpringTask那些轻量级定时框架留下的问题,做的一个比较全面的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/229548.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天津Java入门培训班 如何选择Java机构?

作为最受欢迎的编程语言&#xff0c;Java简直是IT领域的敲门砖&#xff0c;只要精通Java语言&#xff0c;找到好工作&#xff0c;进入大企业又多了一层保障。很多人都向往Java编程的广阔就业前景&#xff0c;却苦于不懂Java编程知识&#xff0c;一直在自学和参加培训中纠结。 …

设计模式:简单工厂模式、工厂方法模式、抽象工厂模式

简单工厂模式、工厂方法模式、抽象工厂模式 1. 为什么需要工厂模式&#xff1f;2. 简单工厂模式2.1. 定义2.2. 代码实现2.3. 优点2.4. 缺点2.5. 适用场景 3. 工厂方法模式3.1. 有了简单工厂模式为什么还需要有工厂方法模式&#xff1f;3.2. 定义3.3. 代码实现3.4. 主要优点3.5.…

LinkedList与ArrayList的比较

1.LinkedList 基于双向链表&#xff0c;无需连续内存 随机访问慢&#xff08;要沿着链表遍历&#xff09; 头尾插入删除性能高 占用内存多 2.ArrayList 基于数组&#xff0c;需要连续内存 随机访问快&#xff08;指根据下标访问&#xff09; 尾部插入、删除性能可以&…

挑战 ChatGPT 和 Google Bard 的防御

到目前为止&#xff0c;科学家已经创建了基于人工智能的聊天机器人&#xff0c;可以帮助内容生成。我们还看到人工智能被用来创建像 WormGPT 这样的恶意软件&#xff0c;尽管地下社区对此并不满意。但现在正在创建聊天机器人&#xff0c;可以使用生成人工智能通过即时注入活动来…

Android Matrix剪切clipPath缩放scale图片postTranslate圆形放大镜,Kotlin(1)

Android Matrix剪切clipPath缩放scale图片postTranslate圆形放大镜&#xff0c;Kotlin&#xff08;1&#xff09; 实现查看图片的放大镜&#xff0c;放大镜随着手指在屏幕上的移动&#xff0c;放大镜里面展示手指触点为中心、半径长度的圆形放大后的图片。 剪切出一块圆形Path…

K8S集群部署MySql

挂载MySQL数据卷 在k8s集群中挂载MySQL数据卷 需要安装一个NFS。 在主节点安装NFS yum install -y nfs-utils rpcbind 在主节点创建目录 mkdir -p /nfs chmod 777 /nfs 更改归属组与用户 chown -R nfsnobody:nfsnobody /nfs 配置共享目录 echo "/nfs *(insecure,rw,s…

大数据平台Bug Bash大扫除最佳实践

一、背景 随着越来越多的"新人"在日常工作以及大促备战中担当大任&#xff0c;我们发现仅了解自身系统业务已不能满足日常系统开发运维需求。为此&#xff0c;大数据平台部门组织了一次Bug Bash活动&#xff0c;既能提升自己对兄弟产品的理解和使用&#xff0c;又能…

【已解决】打印PDF文件,如何跳过不需要的页面?

打印PDF文件的时候&#xff0c;有时候我们只需要打印其中的几页&#xff0c;并不需要全部打印&#xff0c;那如何在打印时跳过那些不需要的页面呢&#xff1f;不清楚的小伙伴一起来看看吧&#xff01; 如果你是通过网页打开PDF文件&#xff0c;那么可以在页面中找到并点击“打…

k8s的声明式资源管理

在k8s当中支持两种声明资源的方式&#xff1a; 1、 yaml格式&#xff1a;主要用于和管理资源对象 2、 json格式&#xff1a;主要用于在API接口之间进行消息传递 声明式管理方法(yaml)文件 1、 适合对资源的修改操作 2、 声明式管理依赖于yaml文件&#xff0c;所有的内容都…

内存管理机制

内存管理机制与内存映射相关。 一、C与C 之所以将C与C放在一起是因为C是C的超集&#xff1b; 但是C是面向过程语言&#xff0c;C是面向对象的语言&#xff1b; C与C都可以使用malloc、calloc、realloc来申请内存空间&#xff1b; 其中void* malloc(size_t size)是在内存的动态…

2023年度回顾:怿星科技的转型与创新

岁月不居&#xff0c;时节如流。随着2023年的落幕&#xff0c;怿星科技在这一年中不仅实现了自身的转型&#xff0c;还在技术创新、产品研发、行业合作和人才培养等方面取得了显著的成就。这一年&#xff0c;怿星科技正式完成了从服务型公司向产品型公司的战略转变&#xff0c;…

软件测试方法分类-按照开发阶段划分细讲

前面我给出了整体的软件测试分类&#xff0c;那么接下来&#xff0c;我会将每个分类进行细讲。 第一个我们要说到的就是按照开发阶段划分。 我们都知道软件测试方法分类中&#xff0c;如果按照开发阶段划分&#xff0c;可以分为&#xff1a; 1&#xff0c;单元测试 (Unit Te…

VMware 虚拟机 ubuntu 20.04 硬盘扩容方法

前言 最近由于需要编译 【RK3568】的 Linux SDK&#xff0c;发现 虚拟机默认的 200G 空间不足了&#xff0c;因此想增加这个 200G 空间的限制&#xff0c;通过网络上查找了一些方法&#xff0c;加上自己亲自验证&#xff0c;确认 硬盘扩容 正常&#xff0c;方法也比较的容易&a…

P5534 【XR-3】等差数列————C++、C

目录 【XR-3】等差数列题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示 解题思路Code运行结果 【XR-3】等差数列 题目描述 小 X 给了你一个等差数列的前两项以及项数&#xff0c;请你求出这个等差数列各项之和。 等差数列&#…

如何使用idea部署springboot项目全过程

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

k8s的陈述式管理

k8s的陈述式管理&#xff1a; 所谓的陈述式管离也就是命令行工具 优点&#xff1a;90%以上都可以满足 对资源的增删查比较方便&#xff0c;对改不是很友好 缺点&#xff1a;命令比较冗长&#xff0c;复杂&#xff0c;难记 声明式&#xff1a; k8s当中的YAML文件来实现资源管…

对接第三方接口鉴权(Spring Boot+Aop+注解实现Api接口签名验证)

前言 一个web系统&#xff0c;从接口的使用范围也可以分为对内和对外两种&#xff0c;对内的接口主要限于一些我们内部系统的调用&#xff0c;多是通过内网进行调用&#xff0c;往往不用考虑太复杂的鉴权操作。但是&#xff0c;对于对外的接口&#xff0c;我们就不得不重视这个…

Axure骚操作:【制作可暂停与不可暂停进度加载条】

目录 一、不可暂停进度条 1.1 前期准备 1.2 效果假想 1.3 适用场景 1.4 实现步骤 &#xff08;1&#xff09;除按钮外的元件设置隐藏 &#xff08;2&#xff09;给按钮添加交互 &#xff08;3&#xff09;给变量值文本标签添加交互 &#xff08;4&#xff09;给进度条矩…

android开发百度地图api实现定位图标随手机方向转动

该功能的实现依赖于手机中的传感器元件如陀螺仪、加速度计等&#xff0c;具体开发详见android的官方开发文档&#xff1a; 传感器概览 | Android 开发者 | Android Developershttps://developer.android.com/guide/topics/sensors/sensors_overview?hlzh-cn要自定义一个传…

zookeeper之集群搭建

1. 集群角色 zookeeper集群下&#xff0c;有3种角色&#xff0c;分别是领导者(Leader)、跟随着(Follower)、观察者(Observer)。接下来我们分别看一下这三种角色的作用。 领导者(Leader)&#xff1a; 事务请求&#xff08;写操作&#xff09;的唯一调度者和处理者&#xff0c;保…