当前位置: 首页 > news >正文

xxl-job的分片广播+单播

1 介绍一下xxl-job

XXL-JOB 是一个分布式任务调度平台,旨在为分布式应用系统提供开箱即用的调度解决方案。它非常易于使用,并具有很高的可扩展性。以下是 XXL-JOB 的详细介绍,包括其核心功能、架构设计、主要组件及其应用场景。

核心功能

  1. 简单易用:

    • 提供友好的 Web 控制台,支持任务的增删查改操作。
    • 支持手动触发、停止和重试任务。
  2. 调度策略丰富:

    • 支持 CRON 表达式调度,精确到秒。
    • 支持手动触发、周期调度、固定频率调度、补偿调度等多种调度策略。
  3. 任务执行方式:

    • 支持 BEAN、GLUE(即在控制台编辑的脚本,比如JavaScript、Groovy)、脚本(Shell、Python 等)的任务执行方式。
  4. 分布式支持:

    • 天然支持集群,采用无中心设计,可以轻松进行水平扩展。
    • 支持广播模式和分片广播模式的任务执行方式。
  5. 执行日志:

    • 详细记录每一次任务执行情况,包括任务开始时间、结束时间、执行结果和日志内容。
  6. 失败告警:

    • 支持邮件、钉钉等多种方式进行任务执行失败告警。

架构设计

XXL-JOB 采用调度中心和执行器的分离设计,调度中心负责任务的管理和调度,执行器负责任务的具体执行。其主要架构组件包括:

  1. 调度中心(Admin)

    • 提供 Web 管理界面,进行任务的管理和调度。
    • 负责计算调度任务并将任务下发给执行器。
  2. 执行器(Executor)

    • 实现执行任务的具体逻辑。
    • 从调度中心接收任务并执行,执行完毕后回传执行结果。
  3. 任务调度:

    • 基于 CRON 表达式或自定义调度方式进行任务调度。
  4. 执行日志:

    • 记录任务的执行日志,方便查看任务的执行情况。

主要组件

  1. 调度中心(Admin):

    • Web 控制台:提供任务的管理和监控。
    • 调度管理:执行调度任务的分发。
  2. 执行器(Executor):

    • 任务处理器:处理具体执行的任务逻辑。
    • 日志记录:记录任务执行日志。

典型使用场景

  1. 数据处理:

    • 定时从数据库、文件系统或者其他数据源提取数据,进行数据清洗和处理,再存储到数据仓库或其他存储系统。
  2. 营销活动:

    • 定时推送营销消息或进行营销数据统计分析。
  3. 定时备份:

    • 定时备份数据库、文件系统,以防止数据丢失。
  4. 定时检测:

    • 定时进行服务器健康检测、系统性能监控等。

示例项目

以下是一个简单的示例项目,展示如何快速集成 XXL-JOB 到 Spring Boot 项目中。

1. 引入依赖

在您的 pom.xml 文件中添加 XXL-JOB 核心依赖:

<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.0</version> <!-- 版本号根据实际情况选择 -->
</dependency>
2. 配置 XXL-JOB 执行器

application.propertiesapplication.yml 文件中配置执行器参数:

xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
xxl.job.executor.appname=xxl-job-executor-example
xxl.job.executor.ip=
xxl.job.executor.port=9999
xxl.job.accessToken=
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
xxl.job.executor.logretentiondays=30
3. 启动类添加 XXL-JOB 配置

在 Spring Boot 主入口类中添加 XXL-JOB 执行器配置:

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class XxlJobConfig {@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses("http://127.0.0.1:8080/xxl-job-admin");xxlJobSpringExecutor.setAppname("xxl-job-executor-example");xxlJobSpringExecutor.setIp(null);xxlJobSpringExecutor.setPort(9999);xxlJobSpringExecutor.setAccessToken(null);xxlJobSpringExecutor.setLogPath("/data/applogs/xxl-job/jobhandler");xxlJobSpringExecutor.setLogRetentionDays(30);return xxlJobSpringExecutor;}
}
4. 编写任务处理器

在项目中编写一个任务处理器,并使用 @XxlJob 注解声明任务名称:

import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.log.XxlJobLogger;
import com.xxl.job.core.biz.model.ReturnT;
import org.springframework.stereotype.Component;@Component
public class SampleJob {@XxlJob("sampleJobHandler")public ReturnT<String> execute(String param) throws Exception {XxlJobLogger.log("XXL-JOB, Hello World.");System.out.println("Executing job with param: " + param);return ReturnT.SUCCESS;}
}
5. 在控制台配置任务

登录 XXL-JOB 管理控制台,创建并配置调度任务。

通过这些步骤,你可以轻松在项目中集成和使用 XXL-JOB 进行任务调度。XXL-JOB 提供了强大的功能和灵活的配置,适用于各种场景下的任务调度需求。

2 弄懂xxl-job的bean调度策略和路由策略以及阻塞策略。

2.1 bean模式

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

2.2 xxl-job的bean调度策略和jobHandler路由策略以及阻塞策略关系

在 XXL-JOB 的任务调度中,Bean 调度策略、JobHandler 路由策略以及阻塞策略是三个不同层面的配置选项,它们共同作用来决定任务的执行方式。下面我们来详细讲解这些概念及其相互关系。

1. Bean 调度策略 (Bean 的定义和注册)

Bean 调度策略主要用于定义任务的实际执行逻辑。在 Spring 项目中,通常通过 @XxlJob 注解将某个方法注册为 XXL-JOB 的 JobHandler。

例如:

import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;@Component
public class MyJobHandler {@XxlJob("myJobHandler")public void execute() throws Exception {System.out.println("Task is running...");}
}

在 XXL-JOB 管理后台中,配置任务的 JobHandler 为 myJobHandler,这个任务就会执行上述 MyJobHandler 类中的 execute 方法。

2. JobHandler 路由策略

JobHandler 路由策略决定任务在多个可用的执行器 (Executor) 节点上如何分发和执行。XXL-JOB 支持以下几种常见的路由策略:

  • FIRST:优先路由至第一个机器;这种策略在大部分集群部署场景中不推荐,因为它会导致负载不均衡。
  • LAST:优先路由至最后一个机器。
  • ROUND:按顺序轮询;适用于负载均衡较为均匀的场景。
  • RANDOM:随机选择;适用于需要一定随机性的任务分发。
  • CONSISTENT_HASH:一致性哈希;对于同类任务会固定路由到某个机器,适合需要状态保持的任务。
  • LEAST_FREQUENTLY_USED:最不经常使用策略,即选择执行次数最少的机器。
  • LEAST_RECENTLY_USED:最久未使用策略,即选择最久未执行任务的机器。
  • FAILOVER:故障转移,优先选择故障机器以外的机器。
  • BUSYOVER:忙转移,优先选择即使繁忙机器也要执行。
  • SHARDING_BROADCAST(2.1中分片广播路由策略):分片广播;用于将任务分片、并行执行在不同的机器上。

3. 阻塞策略

阻塞策略决定了当执行器忙碌,无法立即执行新任务时如何处理。这可以有效地帮助我们控制任务调度的行为以及系统的资源利用。常见的阻塞策略有:

  • SERIAL_EXECUTION:串行阻塞。当调度线上已有任务在执行时,新任务将被阻塞,直到前一个任务完成。
  • DISCARD_LATER:丢弃后续调度。如果调度线上已有任务在执行,新任务将被丢弃。
  • COVER_EARLY:覆盖早期任务。如果调度线上已有任务在执行,新任务将覆盖旧任务。

实际情况如果碰到阻塞的情况最好带有报警功能。
在这里插入图片描述

三者关系总结

  • Bean 调度策略:决定任务的实际执行逻辑,通过 Spring Bean 和 @XxlJob 注解进行配置。
  • JobHandler 路由策略:决定任务在多个执行器节点上的分发方式,通过 XXL-JOB 管理后台配置。
  • 阻塞策略:决定当执行器忙碌时,如何处理新到达的任务,也通过 XXL-JOB 管理后台配置。

每个 JobHandler 可以根据具体需求配置上述策略,使得任务调度系统更灵活和智能。例如:

  • Bean 调度策略定义了任务执行的具体方法。
  • JobHandler 路由策略确保任务能在集群中合理分发,达到负载均衡或高可用性的目标。
  • 阻塞策略控制任务调度器在资源紧张情况下的行为,避免系统过载或者无意义的任务重叠。

示例配置

在 XXL-JOB 管理后台,配置一个任务时,可以对每个任务单独设置这些策略:

  • 选择 JobHandler (e.g., myJobHandler)
  • 指定路由策略 (e.g., ROUND)
  • 设置阻塞策略 (e.g., COVER_EARLY)

通过这样配置,可以实现灵活而高效的任务调度系统。

3 xxl-job中分片广播和单播

3.1 分片广播和单播的区别

在 XXL-JOB 中,分片广播和单播是两种不同的任务调度模式,适用于不同的业务场景。下面详细说明两者的区别:

1. 单播(Broadcast)

单播是指任务在多个可用的执行器节点中选择一个节点进行执行。这种策略适用于任务在任何一个节点上执行都可以,并且无需分片处理的情况。

  • 执行目标:只有一个执行器节点会被选中来执行任务。
  • 实现方式:通过路由策略选择一个执行器节点,例如随机选择、轮询选择等。
  • 适用场景:适用于需要单一节点处理,且不需要并行拆分的任务。例如,数据清理、日志归档等操作。

示例代码(单播任务):

import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;@Component
public class MyJobHandler {@XxlJob("myJobHandler")public void execute() throws Exception {System.out.println("Single instance task is running...");}
}

在管理后台中配置任务选择的路由策略,例如设置为 ROUND(轮询):

  • JobHandlermyJobHandler
  • 路由策略ROUND
  • 阻塞策略:根据需要选择,例如 SERIAL_EXECUTION

2. 分片广播(Sharding Broadcast)

分片广播是指任务被拆分成多个子任务,并由多个执行器节点并行处理。每个执行器节点处理分片任务的一部分,适用于需要大规模并行处理的场景。

  • 执行目标:任务会被拆分,并由多个执行器节点同时处理,每个节点处理任务的一部分。
  • 实现方式:任务根据分片参数(分片索引和分片总数)拆分,并分发到不同的执行器节点。
  • 适用场景:适用于任务需要并行处理和分片处理的场景,例如大规模数据处理、分布式计算等。

示例代码(分片广播任务):

import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.context.XxlJobHelper;
import org.springframework.stereotype.Service;@Service
public class ShardingJobHandler {@XxlJob("shardingJobHandler")public void execute() throws Exception {// 获取当前分片信息int shardIndex = XxlJobHelper.getShardIndex();int shardTotal = XxlJobHelper.getShardTotal();// 根据分片信息执行任务System.out.println("Shard Index: " + shardIndex);System.out.println("Shard Total: " + shardTotal);// 这里可以根据分片信息执行具体业务逻辑// 例如处理数据库中某一段数据}
}

在管理后台中配置任务选择的路由策略和分片参数:

  • JobHandlershardingJobHandler
  • 路由策略SHARDING_BROADCAST
  • 分片总数:设定合理的分片总数,例如 4,表示分成 4 片并行处理。
  • 阻塞策略:根据需要选择,例如 SERIAL_EXECUTION

主要区别总结

特性单播 (Broadcast)分片广播 (Sharding Broadcast)
执行节点数量单个节点多个节点,并行处理
任务拆分不拆分,任务在一个节点上完整执行被拆分成多个子任务,每个节点处理一部分
适用场景需要单节点执行的任务,例如日志清理、定期备份大规模并行处理的任务,例如数据处理、分布式计算
任务复杂度较高,需要在代码中实现分片逻辑

应用场景示例

  • 单播:定期清理系统日志,在多个节点中选择一个节点执行日志删除操作。
  • 分片广播:对大量数据进行分析,将数据根据分片参数分配到不同的节点并行处理,以加速任务完成。

通过选择合适的调度策略,可以充分利用系统资源,提高任务处理效率。单播适用于简单、无需并行处理的任务,而分片广播则适用于需要并行处理的大规模任务。

3.2 也就是说在分片的时候需要我们在代码内部实现具体的分片处理逻辑,如果不设置,就会变成每个节点执行一样的任务对吗?假如有一个扫库任务,如果选择分片广播,咋么做

是的,您理解得非常正确。在使用分片广播策略时,具体的分片处理逻辑需要在任务代码中实现。下面是对此过程的详细解释:

1. 分片逻辑的必要性

使用分片广播策略的主要目的是为了并行处理大任务,通过将任务拆分成多个小任务并分发给多个实例执行。如果在代码中没有实现具体的分片逻辑,每个实例会执行相同的任务,这不仅会导致重复处理,还会浪费计算资源,达不到预期的并行加速效果。

2. 如何实现分片逻辑

在任务代码中,需要获取当前任务的分片信息(例如分片索引和分片总数),然后根据这些信息来决定每个实例应该处理的数据子集。这通常涉及到以下几个步骤:

  1. 获取分片信息
    使用 XxlJobHelper 提供的方法来获取当前分片的索引和分片总数。

  2. 根据分片信息划分数据
    具体如何划分数据取决于数据的组织方式和任务的需求。可以根据主键、行号、哈希值等进行分片。

  3. 执行分片任务
    根据划分结果,实例仅处理属于自己分片的数据子集。

示例代码详解

以下是一个详细的代码示例,演示如何实现一个分片广播的扫库任务:

import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.context.XxlJobHelper;
import org.springframework.stereotype.Service;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;@Service
public class DatabaseShardingTask {@XxlJob("shardingDatabaseJobHandler")public void shardingDatabaseJobHandler() throws Exception {// 获取分片参数int shardIndex = XxlJobHelper.getShardIndex();int shardTotal = XxlJobHelper.getShardTotal();// 数据库连接配置(请根据实际情况修改)String url = "jdbc:mysql://localhost:3306/your_database";String username = "your_username";String password = "your_password";// 示例代码:读取分片对应的数据并处理try (Connection connection = DriverManager.getConnection(url, username, password);Statement statement = connection.createStatement()) {// 假设数据库表有一个 auto_increment 主键 id,通过 MOD 函数进行分片处理String query = String.format("SELECT * FROM your_table WHERE MOD(id, %d) = %d", shardTotal, shardIndex);ResultSet rs = statement.executeQuery(query);// 处理结果集while (rs.next()) {// 处理单条数据int id = rs.getInt("id");String data = rs.getString("data_column");// 执行具体的业务处理逻辑System.out.println("Processing id: " + id + ", data: " + data);// 比如:更新数据状态// updateDataStatus(id, newStatus);}} catch (Exception e) {// 记录日志并抛出异常XxlJobHelper.log(e);throw e;}}// 示例辅助方法:更新数据状态private void updateDataStatus(int id, String newStatus) {// 更新数据逻辑}
}

总结

  • 在 XXl-JOB 分片广播策略中,需要在任务代码中明确实现分片处理逻辑。
  • 未设置分片逻辑会导致所有分片实例执行相同的任务,浪费资源。
  • 通过获取当前任务的分片索引和分片总数,可以精确划分数据,并让每个实例只处理其对应的数据子集。

合理的分片和任务处理不仅可以提高效率,还能均衡负载,确保任务在分布式环境中高效稳定地执行。

相关文章:

xxl-job的分片广播+单播

1 介绍一下xxl-job XXL-JOB 是一个分布式任务调度平台&#xff0c;旨在为分布式应用系统提供开箱即用的调度解决方案。它非常易于使用&#xff0c;并具有很高的可扩展性。以下是 XXL-JOB 的详细介绍&#xff0c;包括其核心功能、架构设计、主要组件及其应用场景。 核心功能 简…...

情感分类代码

在进行自然语言处理中的情感分类时&#xff0c;通常需要准备以下几方面的内容&#xff1a; 1. **数据集**&#xff1a;高质量的标注数据集是关键&#xff0c;包括正面、负面和中性情感标记的文本。 2. **情感词典**&#xff1a;可用的情感词典&#xff0c;如SentiWordNet&…...

WPF—常用控件、属性、事件、详细介绍

WPF—常用控件、属性、事件、详细介绍 WPF&#xff08;Windows Presentation Foundation&#xff09;是微软推出的基于Windows 的用户界面框架&#xff0c;属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架&#xff0c;真正做到了分离界面设计人员与开发人…...

Oracle遭遇bug导致共享内存无法分配报ORA-04031错误

1.故障描述 在7月17日上午11时左右&#xff0c;收到告警短信&#xff0c;提示集群节点2宕机&#xff0c;当即登陆该节点进行查看&#xff0c;发现数据库状态正常。但日志里出现大量的ORA-04031报错&#xff0c;提示无法分配shared_pool&#xff0c;当时手动执行shared pool刷新…...

SAP BRIM用于应收账款AR收入中台

SAP BRIM&#xff08;Billing and Revenue Innovation Management&#xff09;是SAP提供的一个综合性解决方案&#xff0c;旨在帮助企业高效管理计费和收入流程。它与SAP ERP系统集成&#xff0c;提供端到端的功能&#xff0c;简化计费流程&#xff0c;自动化收入确认&#xff…...

LVS原理简介

LVS是Linux virtual server的缩写&#xff0c;为linux虚拟服务器&#xff0c;是一个虚拟的服务器集群系统。LVS简单工作原理为用户请求LVS VIP&#xff0c;LVS根据转发方式和算法&#xff0c;将请求转发给后端服务器&#xff0c;后端服务器接收到请求&#xff0c;返回给用户。对…...

Qt五大核心特性之元对象系统

前言 Qt 的元对象系统&#xff08;Meta-Object System&#xff09;是 Qt 框架的核心之一&#xff0c;提供了一些 C 原生不具备的功能(因为在C它们是静态的)&#xff0c;如反射、信号槽机制、属性系统等。通过这个系统&#xff0c;Qt 实现了许多强大的功能&#xff0c;这使得它…...

开放式耳机伤耳朵吗?开放式耳机在一定程度上保护我们的耳朵

开放式耳机通常被认为对耳朵的伤害较小&#xff0c;因为它们不需要插入耳道&#xff0c;从而减少了耳道内的压力和潜在的感染风险。与传统入耳式耳机相比&#xff0c;开放式耳机允许耳朵自然通风&#xff0c;减少耳道内的湿气和热量积聚&#xff0c;这有助于保持耳朵的健康。 然…...

JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车系统源码

&#x1f697;&#x1f4a8;打车、顺风车、滴滴车&跑腿系统&#xff0c;一键解决出行生活难题&#xff01; 一、出行新选择&#xff0c;打车从此不再难 忙碌的生活节奏&#xff0c;让我们常常需要快速、便捷的出行方式。打车、顺风车、滴滴车系统&#xff0c;正是为了满足…...

批量智慧:揭秘机器学习中的批量大小

标题&#xff1a;批量智慧&#xff1a;揭秘机器学习中的批量大小 机器学习是人工智能的一个分支&#xff0c;它使得计算机能够从数据中学习并做出决策或预测。在机器学习的过程中&#xff0c;批量大小&#xff08;Batch Size&#xff09;是一个至关重要的超参数&#xff0c;它…...

苹果Vision Pro生态发展:现状、挑战与未来展望

苹果公司以其创新技术和强大的生态系统闻名于世。在最近的财报会议上,CEO蒂姆库克分享了Vision Pro平台的最新进展,引发了业界的广泛关注。本文将深入探讨Vision Pro生态的现状、面临的挑战以及与其他XR平台的对比分析。 一、Vision Pro生态现状 据库克介绍,Vision Pro平台…...

湖南第一师范学院来访炼石,推动密码与数据安全合作

2024年8月11日&#xff0c;为进一步加强交流与合作&#xff0c;深入探讨校企产学研合作&#xff0c;湖南第一师范学院计算机学院院长杨恒伏一行莅临炼石调研指导。湖南第一师范学院计算机学院院长杨恒伏、网络空间安全系主任周聪等专家领导出席。炼石网络创始人兼CEO白小勇对湖…...

全面解析ETL:数据仓库架构中的关键处理过程

目录 一、数据仓库架构中的ETL 二、数据抽取 &#xff08;1&#xff09;逻辑抽取 &#xff08;2&#xff09;物理抽取 &#xff08;3&#xff09;变化数据捕获 三、数据转换 四、数据装载 &#xff08;1&#xff09;提高装载效率 &#xff08;2&#xff09;处理装载失败 五、ET…...

keepalived的介绍与配置

Keepalived是一个轻量级别的高可用解决方案&#xff0c;同时也是一个免费开源的、用C编写的类似于layer3, 4 & 7&#xff08;也有说法认为是layer3, 4 & 5&#xff09;交换机制的软件&#xff0c;主要提供负载均衡和高可用服务。它自动完成检测服务器的状态、故障隔离和…...

二叉树概念与使用

文章目录 一、作用二、二叉树概念特征2.1二叉树概念补充2.1.1度2.1.2深度2.1.3若规定根节点的层数为1&#xff0c;则深度为h的二叉树的最大结点数是2^h-1个结点 三、使用2.1二叉树存储&#xff0c;检索&#xff0c;插入项目 四、 二叉树检索的时间复杂度1. 普通二叉树2. 二叉搜…...

MongoDB 在 Java 中的使用教程

目录 MongoDB 简介环境准备使用 Java 连接 MongoDB基本 CRUD 操作复杂查询操作索引和性能优化事务管理总结 1. MongoDB 简介 MongoDB 是一个基于分布式文件存储的 NoSQL 数据库系统。它以文档&#xff08;JSON 形式&#xff09;存储数据&#xff0c;具有高扩展性和灵活的数据…...

微前端架构下的配置管理:策略、实现与最佳实践

微前端架构通过将一个大型前端应用拆分为多个小型、自治的子应用&#xff0c;提升了开发效率和应用的可维护性。然而&#xff0c;随着应用规模的扩大和子应用数量的增加&#xff0c;配置管理变得日益复杂。本文将详细介绍在微前端架构下实现应用配置管理的策略、实现方法和最佳…...

React Native中好用的UI组件库

文章目录 前言1.React Native ElementsStar数超24K地址 2.React Native UI KittenStar数超20K地址 3.NativeBaseStar数超20K地址 前言 下面是React Native中一些常用的UI库 1.React Native Elements Star数超24K 官方介绍 React Native Elements 的目标是提供一套用于在 Rea…...

WebSocket 快速入门

WebSocket是什么 WebSocket 是基于 TCP 的一种新的应用层网络协议。它实现了浏览器与服务器全双工通信&#xff0c;即允许服务器主动发送信息给客户端。因此&#xff0c;在 WebSocket 中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创建持久性…...

MySQL中的存储文件和IO机制详细解析

MySQL中的存储文件和IO机制详细解析 一、引言 MySQL作为广泛使用的关系型数据库管理系统&#xff0c;凭借其高性能和稳定性在各大应用中扮演了关键角色。在实际应用中&#xff0c;数据库需要对大量数据进行存储、检索、更新等操作。这些操作离不开底层的文件存储系统&#xf…...

复习之 java 锁

裁员在家&#xff0c;没有面试机会&#xff0c;整理整理面试知识点吧&#xff01; 不得不知道的java 锁 Java 中&#xff0c;提供了两种方式来实现同步互斥访问&#xff08;也就是锁&#xff09;&#xff1a;synchronized 和 Lock 多线程编程中&#xff0c;有可能会出现多个线…...

数据结构与算法 - 图

一、概念 图是有顶点&#xff08;vertex&#xff09;和边&#xff08;edge&#xff09;组成的数据结构&#xff0c;例如 该图有4个顶点&#xff1a;A、B、C、D以及四条有向边&#xff0c;有向图中&#xff0c;边是单向的。 1. 有向图 VS 无向图 如果是无向图&#xff0c;那么…...

白骑士的HTML教学基础篇 1.1 HTML简介

在现代互联网的世界里&#xff0c;HTML&#xff08;HyperText Markup Language&#xff09;是所有网页的基础语言。无论是简约的个人博客还是复杂的商业网站&#xff0c;HTML都扮演着不可或缺的角色。掌握HTML是学习前端开发的第一步&#xff0c;这不仅能够帮助你构建静态网页&…...

c语言基础知识学习

1. C 语言简介 定义&#xff1a;C 语言是一种过程式编程语言&#xff0c;设计用于系统编程和应用程序开发。特点&#xff1a;高效、灵活、接近硬件&#xff0c;支持指针和内存操作。 1. 基本语法 程序结构&#xff1a; C 语言程序由函数组成&#xff0c;main 函数是程序的入口…...

Qt/QML学习-Dial

QML学习 Dial例程视频讲解代码 main.qml import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")Dial {anchors.fill: parentid: dial// 设置旋钮的范围from: 0to: …...

达梦数据库系列—48.DMHS实现Mysql到DM8的同步

目录 DMHS实现Mysql到DM8的同步 1、准备介质 2、安装 3、准备源端Mysql和目标端DM8 软件安装 数据库创建 打开归档 开启附加日志 创建辅助表 Mysql客户端驱动 Mysql端安装ODBC 检查依赖包 创建连接用户 创建测试表 4、同步配置 修改服务配置 Mysql到Dm单向同步…...

PostgreSQL的启动过程

PostgreSQL的启动过程 PostgreSQL的启动过程中主要做了以下几件事&#xff1a; 初始化数据目录&#xff1a;如果数据目录是第一次使用&#xff0c;PostgreSQL会进行初始化&#xff0c;创建必要的系统表和目录结构。 读取配置文件&#xff1a;PostgreSQL会读取并解析配置文件&…...

ActiveMQ、RabbitMQ、Kafka、RocketMQ的区别简介

目录 1. 基本概述 2. 性能与吞吐量 3. 消息模型与特性 4. 生态系统与社区支持 5. 复杂性与运维成本 6.在优先级队列、延迟队列、死信队列、重试队列、消费模式、广播模式方面的区别 7.在消息回溯、消息堆积持久化、消息追踪、消息过滤方面的区别 8.在多租户、多协议支持…...

7.1 多态案例

一、案例1&#xff1a;计算器类 1.1 普通方式实现 #include <iostream> #include <string> using namespace std;class Calculator { public:int num1;int num2;int result(string oper){if (oper "")return num1 num2;else if (oper "-"…...

革新测试管理:集远程、协同、自动化于一身的统一测试管理平台

一、研发背景 当下汽车电子测试领域随着不断发展&#xff0c;自动化、智能化的软硬件一体测试解决方案已经成为趋势。能够整合各种测试资源、自动化测试流程&#xff0c;并提供数据分析和可视化报告&#xff0c;从而提高测试效率、降低成本&#xff0c;并确保汽车电子系统的可…...