iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >XXL-Job快速入门+详细教程
  • 402
分享到

XXL-Job快速入门+详细教程

java开发语言xxl-job定时任务分布式 2023-09-27 14:09:40 402人浏览 泡泡鱼
摘要

XXL-Job快速入门+详细教程 1 概念 XXL-JOB是一个轻量级分布式任务调度平台 详细说明:XXL-JOB是一个任务调度框架,通过引入XXL-JOB相关的依赖,按照相关格式撰写代码后,可在

XXL-Job快速入门+详细教程

1 概念

XXL-JOB是一个轻量级分布式任务调度平台
详细说明:XXL-JOB是一个任务调度框架,通过引入XXL-JOB相关的依赖,按照相关格式撰写代码后,可在其可视化界面进行任务的启动,执行,中止以及包含了日志记录与查询和任务状态监控
如果将XXL-JOB形容为一个人的话,每一个引入xxl-job的微服务就相当于一个独立的人(执行器),而按照相关约定格式撰写的Handler为餐桌上的食物,可视化界面则可以决定哪个执行器(人),吃东西或者不吃某个东西(定时任务),在什么时间吃(Corn表达式控制或者执行或终止或者;立即开始);

每一个xxl-job微服务 = 独立的人(执行器)每一个Handler = 餐桌上的食物"可视化界面可以决定哪个人(执行器)吃或者不吃某个食物(定时任务)"

Quartz的不足:Quartz作为开源任务调度中的佼佼者,是任务调度的首选。但是在集群环境中,Quartz采用api的方式对任务进行管理,这样存在以下问题:

  • 通过调用API的方式操作任务,不人性化。
  • 需要持久化业务的QuartzJobBean到底层数据表中,系统侵入性相当严重。
  • 调度逻辑和QuartzJobBean耦合在同一个项目中,这将导致一个问题,在调度
  • 任务数量逐渐增多,同时调度任务逻辑逐渐加重的情况下,此时调度系统的性能将大大受限于业务。

XXL-Job架构图:
在这里插入图片描述

2 快速入门

首先从GitHub上面将项目clone下来,如果网络问题导致速度慢也可以从gitee上面拉取

GitHub地址:https://github.com/xuxueli/xxl-job

Gitee地址:Https://gitee.com/xuxueli0323/xxl-job

2.1 启动xxl-job-admin

  1. 新建idea项目
    在这里插入图片描述
    填写项目url,然后点击clone
    在这里插入图片描述
    项目结构:
    在这里插入图片描述

doc:文档资料,包括"调度数据库"建表脚本
xxl-job-core:公共 jar 依赖
xxl-job-admin:调度中心,项目源码Spring Boot 项目,可以直接启动
xxl-job-executor-samples:执行器,sample 示例项目,其中的 spring boot 工程,可以直接启动。可以在该项目上进行开发,也可以将现有项目改造生成执行器项目。

  1. 配置好数据源,执行sql
    在这里插入图片描述
    执行结果:
    在这里插入图片描述
  2. 打开xxl-job-admin模块,在application.properties中进行后台的配置

数据库的url需要设置时区

jdbc:Mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai

在这里插入图片描述

在这里插入图片描述
4. 启动XxlJobAdminApplication类,访问http://localhost:8080/xxl-job-admin 默认账户admn,密码123456

主页面:
在这里插入图片描述

2.2 创建一个新的定时任务

定位到jobhandler下,新增定时任务

在这里插入图片描述

package com.xxl.job.executor.service.jobhandler;import com.xxl.job.core.biz.model.ReturnT;import com.xxl.job.core.handler.annotation.XxlJob;import org.springframework.stereotype.Component;import static com.xxl.job.core.biz.model.ReturnT.SUCCESS;@Componentpublic class MyJobHandler {        @XxlJob(value = "myJobHandler", init = "", destroy = "")    public ReturnT<String> demoJobHandler(String param) throws InterruptedException {        //模拟业务执行        System.out.println("we should fight..,");        //返回执行结果        return SUCCESS;    }}

2.3 在调度中心新增定时任务

  1. 选中右侧任务管理 - 新增
    在这里插入图片描述
  2. 启动XxlJobExecutorApplication执行器
    在这里插入图片描述
  3. 在调度中心,启动定时任务
    在这里插入图片描述
  4. 查看结果
    在这里插入图片描述

3 详细介绍

自己的项目想要引用xxl-job,导入以下依赖即可

 <dependency>     <groupId>com.xuxueli</groupId>     <artifactId>xxl-job-core</artifactId>     <version>2.0.1</version> </dependency>

3.1 新建执行器

执行器相当于是小组组长,负责任务的具体执行,由它分配线程(组员)执行任务。执行器需要注册到调度中心,这样调度中心才知道怎样选择执行器,或者说做路由。执行器的执行结果,也需要通过回调的方式告诉调度中心。

这里选择 spring boot 项目用来举例子,从源码中单独拷一个项目出来,如果你是在业务项目里集成的话,也是参考这个 sample,在项目里加上 xxl-job-core 的依赖,添加配置就可以创建执行器了。

  1. 在xxl-job-executor-samples下新建自己的执行器模块,例如:xxl-job-executor-zi【直接复制xxl-job-executor-sample-SpringBoot】,修改下文件名和模块名
    在这里插入图片描述

同时修改执行器的名字,否则后面会报命名冲突,修改@XxlJob的value即可

  1. 修改sample-zi模块的配置,将其修改为集群模式

在E盘下,创建xxl-log文件夹

### xxl-job executor log-path 日志存放路径xxl.job.executor.logpath=E:\\xxl-log### 因为我们要模拟执行器集群部署,打包后单击运行多次,为服务设置随机端口server.port=${random.int[10000,19999]}### 执行器的端口xxl.job.executor.port=${random.int[9000,10000]}### 集群部署,这两项配置要一致xxl.job.executor.appname=xxl-job-executor-zixxl.job.executor.address=

可以直接将我的直接复制到配置文件中,然后看哪块重复了,直接删除即可

最终效果:

# no WEB#spring.main.web-environment=false# log configlogging.config=classpath:logback.xml### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin### xxl-job, access tokenxxl.job.accessToken=default_token### xxl-job executor appname### xxl-job executor server-infoxxl.job.executor.ip=### xxl-job executor log-retention-daysxxl.job.executor.logretentiondays=30### xxl-job executor log-path 日志存放路径xxl.job.executor.logpath=E:\\xxl-log### 因为我们要模拟执行器集群部署,打包后单击运行多次,为服务设置随机端口server.port=${random.int[10000,19999]}### 执行器的端口xxl.job.executor.port=${random.int[9000,10000]}### 集群部署,这两项配置要一致xxl.job.executor.appname=xxl-job-executor-zixxl.job.executor.address=
  1. 修改idea配置

启动项目,在本地启动多个执行器集群的时候这里要打上勾(或者直接alt+U),因为我们配置了随机端口,所以是不会报错的。

在这里插入图片描述
4. 启动执行器

启动两个(XxlJobExecutorApplication)

在这里插入图片描述

在这里插入图片描述
5. 新增执行器
在这里插入图片描述
6. 刷新,查看效果
在这里插入图片描述
注册成功

3.2 创建任务

注意点:
新建任务有几个注意点:

  1. 在Spring Bean 实例中(@Component 注解),开发 Job 方法。方法格式要求为"public ReturnT < String > demoJobHandler(String param)",返回值和参数格式是固定的,这个是不能动的,唯一能动的是方法名。
  2. 在方法名上打上 @XxlJob 注解,这里面有几个属性,第一个 value 值对应的是调度中心新建任务的JobHandler属性的值。另外的 init 对应 JobHandler 初始化方法,destory 对应 JobHandler 销毁方法。这两个方法要在任务类里面创建。
  3. 执行日志:需要通过"XxlJobLogger.log"打印执行日志,会写到指定的日志文件中。

3.3 其他概念

3.3.1 路由策略

路由策略是指一个任务可以由多个执行器完成,那具体由哪一个完成呢,这就要看我们指定的路由策略了,这个参数当执行器做集群部署的时候才有意义

Quartz中只能随机负载。
那么这里的第一个,最后一个是按什么顺序来的呢,就是点击查看-注册节点中的1,2,3,4,第一个指的就是1,最后一个指的就是4。
在这里插入图片描述

3.3.2 任务运行模式(BEAN、GLUE)

运行模式分为两种,一种是BEAN,一种是GLUE

  • BEAN模式:这个是在项目中写 Java 类,然后在 JobHandler 里填上 @XxlJob 里面的名字,是在执行器端编写的
  • GLUE模式:支持Java、shellpythonPHPnodejs、PowerShell,这个时候代码是直接维护在调度中心这边的
  1. 新增一个任务,模式选择为GLUE
    在这里插入图片描述
  2. 编写任务
    在这里插入图片描述
    在这里插入图片描述

但是这样会存在一个安全隐患的问题,没有做鉴权。解决方法也很简单,只需要在调度中心和执行器的application.properties 里加上相同的 token 即可。

xxl.job.accessToken=
3.3.3 阻塞处理策略

阻塞处理策略指的是任务的一次运行还没有结束,下一次调度的时间又到了,比如一个任务执行的时间是三分钟,但是设置的频率是每两分钟执行一次,这时候第一次还没执行完,第二次怎么办?

在这里插入图片描述

3.3.4 子任务

当我们要写一个 Job 的时候,任务是相互依赖的。比如下面我要干这么多事情,A干完了干B,B干完了干C,C干完了干D。
在这里插入图片描述

解决这种问题的时候思路有两种。

  • 第一种是把这么多逻辑写成一个大 job,串行化。
  • 第二种就是用子任务,在一个任务末尾触发另一个任务。

如果我们需要在本任务执行结束并且执行成功的时候触发另外一个任务,那么就可以把另外的任务作为本任务的子任务执行,因为每个 Job 都有自己的唯一 id,所以只需在子任务一栏填上任务 id 即可。

3.3.5 任务超时时间

超时的意思就是如果在指定时间内没有返回结果,就不再等待结果。

3.4 高级任务用法

3.4.1 分片任务
  • 假设我们有个任务需要处理20万条数据,每条数据的业务逻辑处理要0.1秒,对于普通任务单线程来讲,需要处理5.5个小时才能处理完。这时候你想要提高速度,你的第一反应就是开多线程跑嘛,我开3个,差不多就是一个多小时就能搞定了,你的思路完全正确!
    这时候将会是下面这种情况,在执行器0上有三个线程在拼命的工作,但是这样大家觉得好不好?不好吧,我执行器0在这累的要死,你执行器1和执行器2在那休息,旱的旱死,涝的涝死,首先这是一个分配不均匀的问题。其次当执行器0三个线程都在工作的时候会浪费它的资源,使之这台服务器的性能也会下降,所以这是一种不好的方式。

在这里插入图片描述
这时候就要用到我们的分片任务了,真正好的方案如下,这是一个既科学又合理的方案。三台执行器各自起一个线程来共同把这个任务完成!
在这里插入图片描述
这时候有个问题,三台机器大家都执行同一段代码,那岂不是乱套了,这个数据你也执行一遍,我也执行一遍,它也执行一遍。 解决的思路很简单,一台执行器处理总数的1/3,大家把需要干的活平均分了嘛,我干1/3,你干1/3,它干1/3,这样也不会产生冲突。
分片任务在运行的时候,调度器会给每个执行器发送一个不同的分片序号,分片的最大序号跟执行器的总数量是一样的,确保每个执行器都会执行到这个任务,比如上图中第一个执行器拿到分片序号0,第二台执行器拿到分片序号1,第三台执行器拿到分片序号2。那现在就好办了,我们只需要把处理的数据进行模3取余,余数为0的数据就由执行器0干,余数为1的数据就由执行器1干,余数为2的数据就由执行器2干。

我们获取数据的sql可以这样写:

//count分片总数,index当前分片数select id,name,passWord from student where status=0 and mod(id,#{count})=#{index} order by id desc limit 1000;

在这里插入图片描述
新建任务的时候选择分片广播,填上对应的JobHandler即可
在这里插入图片描述

最后需要说明一下,分片的数据量不一定是完全均等的数据量,上面的取模只是一个举例,一个思路。我们也可以把0、1、2替换成其他条件去从所有数据中获取部分数据,比如分片序号0的机器我查2018年的数据,分片序号1的机器我查2019年的数据,分片序号2的机器我查2020年的数据。具体怎么分全靠我们的业务来选择。

如果增加或者减少了节点,总分片数和最大分片序号会实时发生变化。

3.4.2 命令任务

命令任务比较有用,比如我们需要定时重启数据库(service restart),定时备份数据文件(cp tar rm),定时清理日志(rm)。

命令行的使用也很简单,只需要把执行的命令作为参数传递进来即可

@Componentpublic class CommandJobHandler2 {        @XxlJob(value = "commandJobHandler2")    public ReturnT<String> commandJobHandlerTest() throws IOException {        //用于获取动态传入进来的参数        String jobParam = XxlJobHelper.getJobParam();        Process exec = Runtime.getRuntime().exec(jobParam);        System.out.println("command run success...");        return ReturnT.SUCCESS;    }}

在这里插入图片描述

启动一下任务,每过3秒,这个计算器就自动弹出来了
在这里插入图片描述

拓展:执行bat文件

@Componentpublic class CommandJobHandler2 {        @XxlJob(value = "commandJobHandler2")    public ReturnT<String> commandJobHandlerTest() throws IOException {        //用于获取动态传入进来的参数        String jobParam = XxlJobHelper.getJobParam();        File file = new File(jobParam);        System.out.println(String.valueOf(file));        System.out.println(file.getAbsolutePath());        System.out.println(file.getCanonicalFile());//        Process exec = Runtime.getRuntime().exec("cmd /k start " + "www.baidu.com");        Process exec2 = Runtime.getRuntime().exec("cmd /k start " + file.getCanonicalFile());        System.out.println("command run success...");//        System.out.println(exec.getInputStream());        //D:\系统默认\桌面\test.bat        return ReturnT.SUCCESS;    }}

在这里插入图片描述

  • 效果:
    在这里插入图片描述
cmd命令执行窗口开闭指令cmd /c dir 是执行完dir命令后关闭命令窗口。cmd /k dir 是执行完dir命令后不关闭命令窗口。cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭。
3.4.3 周期性任务

周期性任务就是在任务的开始和销毁的时候执行自定义的方法,做一些自己想做的事

在这里插入图片描述

注意:集群情况下,我们执行任务的时候需要填写执行器地址(指定哪一个人吃食物)

在这里插入图片描述

执行器地址在执行器管理中查看

在这里插入图片描述
效果:
在这里插入图片描述

4 总结

4.1 概念

  • 调度中心:
  • 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
  • 调度中心支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
  • 调度中心会把调度请求放进一个异步调度队列,理论上默认配置下的调度中心单机能够支撑5000任务并发并且稳定运行,但是由于受网络延迟、DB读写耗时不同、任务调度密集程度不同,会导致任务量上限会上下波动。如果需要支撑更多的任务量,可以通过调大调度线程数、降低调度中心与执行器ping延迟、提升机器配置等。
xxl.job.triggerpool.fast.max=200xxl.job.triggerpool.slow.max=100
  • 执行器
  • 负责接收调度请求并执行任务逻辑,任务模块专注于任务的执行等操作,开发和维护更加简单和高效;
  • 接收调度中心的执行请求、终止请求和日志请求等。

4.2 步骤

①导入xxl-job-core包
<dependency>    <groupId>com.xuxueli</groupId>    <artifactId>xxl-job-core</artifactId>    <version>2.0.1</version></dependency>
②继承 IJobHandle(可省略)

继承IJobHandle+@JobHandler可以通过@XxlJob代替

@JobHandler("testJobHandler")@Componentpublic class TestJobHandler extends IJobHandler {    private final Logger logger = LoggerFactory.getLogger(getClass());    @Override    public ReturnT<String> execute(String param) {        // 分片参数        ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();        int index = shardingVO.getIndex();        int total = shardingVO.getTotal();        // xxl 日志        XxlJobLogger.log("分片参数:当前分片序号 = {}, 总分片数 = {}, 任务参数 = {}", index, total, param);        // spring 日志        logger.info("分片参数:当前分片序号 = {}, 总分片数 = {}, 任务参数 = {}", index, total, param);        // TODO 自己的业务        logger.info("【定时任务】开始,ing...");        // return new ReturnT<>(500, "参数不符合要求");        // return  new ReturnT<>(200, "成功处理 " + count + " 条数据!");        return SUCCESS;    }}
③创建 XxlJobConfig 获取地址
package com.example.job.task.handler;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.ComponentScan;import org.springframework.context.annotation.Configuration;@Configuration@ComponentScan(basePackages = "com.example.job.task")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;    }
④配置文件
#Redis 不配置就报错,在main类排除配置也没用(不配置也可以)spring.redis.host: 10.16.88.34spring.redis.port: 6380spring.redis.database: 0spring.redis.timeout: 5000spring.redis.password: 123456spring.redis.pool.max-idle: 0spring.redis.pool.max-wait: -1#任务调度#任务调度服务地址以及端口xxl.job.admin.addresses=http://10.16.87.104:9001#执行名称xxl.job.executor.appname=loGIStics-appName-job#自动获取xxl.job.executor.ip=#默认端口9999xxl.job.executor.port=9999xxl.job.accessToken=#日志输出地址xxl.job.executor.logpath=./xxl-job-log#日志保存天数:值大于3时生效,启用执行器Log文件定期清理功能,否则不生效xxl.job.executor.logretentiondays=-1
⑤启动调度中心和执行器

参考文章:
https://blog.csdn.net/f2315895270/article/details/104714692
https://juejin.cn/post/6948397386926391333
https://juejin.cn/post/6923508824758288398
https://juejin.cn/post/6924522111465848839
https://blog.csdn.net/JesseCary/article/details/90267907

来源地址:https://blog.csdn.net/weixin_45565886/article/details/128897346

--结束END--

本文标题: XXL-Job快速入门+详细教程

本文链接: https://www.lsjlt.com/news/419656.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • XXL-Job快速入门+详细教程
    XXL-Job快速入门+详细教程 1 概念 XXL-JOB是一个轻量级分布式任务调度平台 详细说明:XXL-JOB是一个任务调度框架,通过引入XXL-JOB相关的依赖,按照相关格式撰写代码后,可在...
    99+
    2023-09-27
    java 开发语言 xxl-job 定时任务 分布式
  • Fluent Mybatis快速入门详细教程
    使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql语句,做到代码逻辑和sql逻辑的合一。 不再需要在Dao中组装查询或更新...
    99+
    2022-11-12
  • NodeJS中的MongoDB快速入门详细教程
    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据...
    99+
    2022-06-04
    入门 快速 教程
  • SpringBoot整合mybatis-plus快速入门超详细教程
    目录前言mybatis-plus 简介mybatis-plus 优点相关链接mybatis-plus实例1、示例项目结构2、数据库准备3、pom.xml:4、application....
    99+
    2022-11-12
  • Unity3D快速入门教程
    Unity3D游戏引擎介绍 Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏...
    99+
    2022-11-12
  • SparkSQL快速入门教程
    目录(一)概述(二)SparkSQL实战(三)非JSON格式的Dataset创建(四)通过JDBC创建DataFrame(五)总结(一)概述 SparkSQL可以理解为在原生的RDD...
    99+
    2022-11-13
  • Springboot快速入门教程
    入门Springboot 项目创建在IDEA中创建即可。 注意点: 1、所有文件都需要放在 : Application文件的同级或下级目录中 2、application.proper...
    99+
    2022-11-12
  • sklearn 快速入门教程
    1. 获取数据 1.1 导入sklearn数据集   sklearn中包含了大量的优质的数据集,在你学习机器学习的过程中,你可以通过使用这些数据集实现出不同的模型,从而提高你的动手实践能力,同时这个过程也可以加深你对理论知识的理解和把握...
    99+
    2023-01-31
    入门教程 快速 sklearn
  • Python OpenCV快速入门教程
    目录OpenCV先决条件我们会在本文中涵盖7个主题读,写和显示图像imread():imshow():imwrite():读取视频并与网络摄像头集成句法调整大小和裁剪图像句法裁剪图像...
    99+
    2022-11-12
  • ASP.NET Core快速入门教程
    目录第一课 基本概念第二课 控制器的介绍第三课 视图与表单第四课 数据验证第五课 路由规则第六课 应用发布与部署源码地址第一课 基本概念 基本概念Asp.Net Core Mvc是....
    99+
    2022-11-13
  • flyway的快速入门教程
    目录 一、简单介绍 二、为什么要使用flyway 三、flyway是如何工作的 四、如何使用flyway 1、先要初始化一个SpringBoot项目,引入依赖 2、在application.yml中添加相关配置 3、根据配置文件中填写的脚本...
    99+
    2023-09-27
    spring boot flyway database mysql
  • BlenderPython编程快速入门教程
    目录Blender Python 编程数据访问访问集合访问属性数据创建/删除自定义属性上下文 Context运算符 Operators (Tools)Operator Poll()将...
    99+
    2022-11-11
  • MyBatis入门学习教程-MyBatis快速入门
    目录Mybatis一、快速开始1、创建 Maven 项目3、配置 Maven 插件4、新建数据库,导入表格5、编写 Mybatis 配置文件6、编写实体类7、编写 mapper 接口...
    99+
    2022-11-12
  • Docker入门教程(详细)
    目录 一、Docker概述 1.1 Docker 为什么出现? 1.2 Dorker历史 1.3 能做什么 虚拟机技术:(通过 软件 模拟的具有完整 硬件 系统功能的、运行在一个完全 隔离 环境中的完整 计算机系统) 容器化技术:(容器化技...
    99+
    2023-08-31
    docker 后端 运维开发 服务器 linux
  • react hooks入门详细教程
    State Hooks 案例: import { useState } from 'react'; function Example() { const [count, se...
    99+
    2022-11-12
  • MASA Blazor入门详细教程
    目录1.什么是Blazor 有什么优势?2.为什么选择MASA Blazor?能用来干什么?3.使用MASA Blazor模板创建第一个Blazor程序4.使用MASA Blazor...
    99+
    2022-11-13
  • 一小时快速入门Python教程
    目录为什么使用PythonPython应用场合Hello world国际化支持便易用的计算器字符串,ASCII和UNICODE使用List条件和循环语句如何定义函数文件I/O异常处理...
    99+
    2022-11-12
  • Vue + OpenLayers 快速入门学习教程
    Openlayers 是一个模块化、高性能并且功能丰富的WebGIS客户端的JavaScript包,用于显示地图及空间数据,并与之进行交互,具有灵活的扩展机制。 简单来说,使用 O...
    99+
    2022-11-12
  • (超详细)Jupyter Notebook入门教程
    Jupyter Notebook入门教程 0. 前言 Jupyter Notebook是一款创建和分享计算文档的网络应用程序。它提供了一种简单、流线型、以文档为中心的体验。由于它可以同时显示丰富的文...
    99+
    2023-09-13
    jupyter python
  • Android超详细SplashScreen入门教程
    这次的Android系统变化当中,UI的变化无疑是巨大的。Google在Android 12中采取了一种叫作Material You的界面设计,一切以你为中心,以你的喜好为风格。相信...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作