RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)
文章目录
- 十.RabbitMQ
- 10.1 简单队列实现
- 10.2 Work 模式(工作队列)
- 10.3 公平分发
- 10.4 RabbitMQ 消息应答与消息持久化
- 消息应答
- 概念
- 配置
- 消息持久化
- 概念
- 配置
十.RabbitMQ
10.1 简单队列实现
简单队列通常指的是一个基本的消息队列,它可以用于在生产者(生产消息的一方)和消费者(消费消息的一方)之间传递消息。

新创建Springboot项目
引入依赖
<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.7.1</version></dependency>
连接工具类
public class ConnectionUtils
{public static Connection getConnection(){try{Connection connection = null;//定义一个连接工厂ConnectionFactory factory = new ConnectionFactory();//设置服务端地址(域名地址/ip)factory.setHost("127.0.0.1");//设置服务器端口号factory.setPort(5672);//设置虚拟主机(相当于数据库中的库)factory.setVirtualHost("/");//设置用户名factory.setUsername("guest");//设置密码factory.setPassword("guest");connection = factory.newConnection();return connection;}catch (Exception e){return null;}}
}
创建生产者
public class Provider01 {public static void main(String[] args) {try {System.out.println("--------生产者-------");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();// 创建队列// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);// 定义发送信息String msg = "hello rabbitmq-kwh";// 发送数据channel.basicPublish("", "test4072", null, msg.getBytes());System.out.println("发送成功....");// 关闭资源channel.close();conn.close();} catch (Exception e) {e.printStackTrace();}}
}
创建消费者
public class Consumer01 {public static void main(String[] args) {try {System.out.println("======消费者======");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();// 创建队列(有就直接连接。没有则创建)// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);// 消费者消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Override //一旦有消息进入 将触发public void handleDelivery(String consumerTag,Envelope envelope, AMQP.BasicProperties properties,byte[] body) throws IOException {String str = new String(body,"utf-8");System.out.println("msg==接收=="+str);}};// 监听队列channel.basicConsume("test4072",true,consumer);}catch (Exception e) {e.printStackTrace();}}
}
10.2 Work 模式(工作队列)
工作队列的概念
- 工作队列模式:生产者将任务发送到队列中,多个消费者从队列中取出任务并并行处理。这意味着,多个消费者可以共同工作来处理同一个队列中的任务。
- 负载均衡:每个消费者只处理一个任务(消息),通过增加消费者数量,任务的处理可以并行化,提高整体处理能力。
工作队列的特点:
- 任务分配:RabbitMQ 将队列中的任务(消息)分配给可用的消费者,通常是按照“轮询”或“平衡”方式分配,即消费者可以公平地处理任务。
- 任务处理并行化:多个消费者可以并行地从同一个队列中消费消息,从而实现任务的并行处理,减轻单一消费者的负担。
- 消息丢失的风险低:通过合理配置队列和消息持久化机制,即使 RabbitMQ 重启,也能确保任务消息不丢失。

生产者
(只是在简单队列中的生产者中循环发送了信息。)
/*** Work 模式(工作队列)*/
public class Provider01 {public static void main(String[] args) {try {System.out.println("--------生产者-------");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();// 创建队列// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);for (int i = 0; i < 50; i++) {// 定义发送信息String msg = "hello rabbitmq-kwh"+i;// 发送数据channel.basicPublish("", "test4072", null, msg.getBytes());Thread.sleep(1000);}System.out.println("发送成功....");// 关闭资源channel.close();conn.close();} catch (Exception e) {e.printStackTrace();}}
}
消费者01
public class Consumer01 {public static void main(String[] args) {try {System.out.println("======消费者01======");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();// 创建队列(有就直接连接。没有则创建)// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);// 消费者消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Override //一旦有消息进入 将触发public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {String str = new String(body,"utf-8");System.out.println("msg==接收=="+str);}};// 监听队列channel.basicConsume("test4072",true,consumer);}catch (Exception e) {e.printStackTrace();}}
}
消费者02
public class Consumer02 {public static void main(String[] args) {try {System.out.println("======消费者02======");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();// 创建队列(有就直接连接。没有则创建)// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);// 消费者消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Override //一旦有消息进入 将触发public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,byte[] body) throws IOException {String str = new String(body,"utf-8");System.out.println("msg==接收=="+str);}};// 监听队列channel.basicConsume("test4072",true,consumer);}catch (Exception e) {e.printStackTrace();}}
}

. 消费者 1 与消费者 2 处理的数据条数一样。
. 消费者 1 偶数 ;消费者 2 奇数
这种方式叫轮询分发(Round-robin)。
10.3 公平分发
指消息被均匀地分配给多个消费者,以便各个消费者的负载大致相等。通过这种方式,RabbitMQ 旨在避免某些消费者过载而其他消费者空闲的情况。

在10.2 中,现在有 2 个消费者,所有的奇数的消息都是繁忙的,而偶数则是轻松的。按照轮询的方式,奇数的任务交给了第一个消费者,所以一直在忙个不停。偶数的任务交给另一个消费者,则立即完成任务,然后闲得不行。而 RabbitMQ 则是不了解这些的。这是因为当消息进入队列,RabbitMQ 就会分派消息。它不看消费者为应答的数目,只是盲目的将消息发给轮询指定的消费者。
改造生产者
/*
同一时刻服务器只会发一条消息给消费者
1 限制发送给消费者不得超过一条消息
*/
channel.basicQos(1);
/*** 公平分发*/
public class Provider01 {public static void main(String[] args) {try {System.out.println("--------生产者-------");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();//同一时刻服务器只会发一条消息给消费者channel.basicQos(1);// 创建队列// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);for (int i = 0; i < 50; i++) {// 定义发送信息String msg = "hello rabbitmq-kwh"+i;// 发送数据channel.basicPublish("", "test4072", null, msg.getBytes());Thread.sleep(1000);}System.out.println("发送成功....");// 关闭资源channel.close();conn.close();} catch (Exception e) {e.printStackTrace();}}}
消费者01
(在10.2 中消费者的基础上,只添加 channel.basicQos(1);,限制每次只消费一个消息)
public class Consumer01 {public static void main(String[] args) {try {System.out.println("======消费者01======");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();//限制每次只消费一个消息channel.basicQos(1);// 创建队列(有就直接连接。没有则创建)// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);// 消费者消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Override //一旦有消息进入 将触发public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,byte[] body) throws IOException {String str = new String(body,"utf-8");System.out.println(envelope.getDeliveryTag()+"msg==接收=="+str);// 休眠一秒钟try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}finally {// 手动确认消息// 第一个参数:消息的序号,// 第二个参数:是否批量,false 单条消息应答 当为 true 时批量应答channel.basicAck(envelope.getDeliveryTag(),false);}}};// 监听队列// 自动应答设为 falsechannel.basicConsume("test4072",false,consumer);}catch (Exception e) {e.printStackTrace();}}
}
消费者02
(同消费者01)

消费者 1 休眠 1 秒,消费者 2 休眠 2 秒。
分别设置接收消息数,手动反馈,关闭自动应答
10.4 RabbitMQ 消息应答与消息持久化
消息应答
概念
**消息应答(ack)**是 RabbitMQ 中一个重要的机制,用于保证消息在被消费者处理后得以正确确认,确保消息不会丢失。如果消费者成功处理了消息,应该发送一个确认应答;如果消费者遇到问题或失败,则可以选择拒绝该消息,甚至重新放回队列供其他消费者处理。
应答类型:
- **自动应答(auto-ack):**自动应答是默认设置,消费者从队列中获取消息后,RabbitMQ 会立即认为该消息已经被成功处理,即使消费者并未真正处理完成。在这种模式下,消息会在被消费后立即从队列中删除,而无需消费者确认。这种模式的缺点是,如果消费者在处理消息时崩溃,消息会丢失。
- **手动应答(manual ack):**消费者处理完消息后,需要显式地发送确认应答,通知 RabbitMQ 该消息已经处理完成。这样,如果消费者没有发送确认应答,RabbitMQ 会重新将消息发送给其他消费者。
配置
// 监听队列
// 参数2:自动应答设为 false; true:开启自动应答
channel.basicConsume("test4072",false,consumer);
参数2为true时:自动确认
只要消息从队列中获取,无论消费者获取到消息后是否成功消费,都认为是消息已经成功消费。一旦rabbitmq 将消息分发给消费者,就会从内存中删除。(会丢失数据消息)
参数2为false时:手动确认
消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。如果有一个消费者挂掉,就会交付给其他消费者。手动告诉 rabbitmq 消息处理完成后,rabbitmq 删除内存中的消息。
反馈:
//手动回馈
channel.basicAck(envelope.getDeliveryTag(),false);
使用 Nack 让消息回到队列中
// 处理条数; 是否批量处理 ;是否放回队列 false 丢弃
channel.basicNack(envelope.getDeliveryTag(),false,true);
生产者
/*** 消息应答*/
public class Provider01 {public static void main(String[] args) {try {System.out.println("--------生产者-------");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();//同一时刻服务器只会发一条消息给消费者channel.basicQos(1);// 创建队列// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);for (int i = 0; i < 50; i++) {// 定义发送信息String msg = "hello rabbitmq-kwh"+i;// 发送数据channel.basicPublish("", "test4072", null, msg.getBytes());Thread.sleep(1000);}System.out.println("发送成功....");// 关闭资源channel.close();conn.close();} catch (Exception e) {e.printStackTrace();}}}
消费者01
public class Consumer01 {public static void main(String[] args) {try {System.out.println("======消费者01======");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();//限制每次只消费一个消息,防止通道中消息阻塞channel.basicQos(1);// 创建队列(有就直接连接。没有则创建)// 队列名称,是否持久化,是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", false, false, false, null);// 消费者消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Override //一旦有消息进入 将触发public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,byte[] body) throws IOException {String str = "";try {str = new String(body,"utf-8");if(envelope.getDeliveryTag()==3){int i=1/0;}System.out.println(envelope.getDeliveryTag()+"消费者01msg==接收=="+str);//手动应答 处理完了// 手动确认消息,即手动反馈// 第一个参数:消息的序号,// 第二个参数:是否批量,false 单条消息应答 ;当为 true 时批量应答channel.basicAck(envelope.getDeliveryTag(),false);}catch(Exception e){// e.printStackTrace();System.out.println("消费者01处理第"+envelope.getDeliveryTag()+"条,时报错,消息内容为"+str);//手动应答 报错了// 第一个参数:消息的序号,// 第二个参数:是否批量,false 单条消息应答 当为 true 时批量应答// 第三个参数:是否放回队列 ;false丢弃 ,true 放回队列channel.basicNack(envelope.getDeliveryTag(),false,true);}// 休眠一秒钟try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}}};// 监听队列// 参数2:自动应答设为 false; true:开启自动应答channel.basicConsume("test4072",false,consumer);}catch (Exception e) {e.printStackTrace();}}
}
消费者02(同消费者01)

消息持久化
概念
RabbitMQ 的持久化机制是确保消息和队列在系统崩溃、重启或其他故障情况下不会丢失的关键功能。确保消息不会丢失需要做两件事:将队列和消息都标记为持久化。
配置
持久化队列
// 创建队列,
// 队列名称,是否持久化(队列),是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", true, false, false, null);
消息持久化
// 发送数据
// MessageProperties.PERSISTENT_TEXT_PLAIN:持久化消息
//设置生成者发送消息为持久化信息(要求保存到硬盘上)保存在内存中
//MessageProperties.PERSISTENT_TEXT_PLAIN,指令完成持久化
channel.basicPublish("", "test4072", MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());
如果改动队列参数配置,需要删除原有的队列,重新建,因为在 rabbitmq 是不允许重新定义一个已存在的队列。

生产者
/*** 消息持久化*/
public class Provider01 {public static void main(String[] args) {try {System.out.println("--------生产者-------");// 获取连接Connection conn = ConnectionUtils.getConnection();//创建通道Channel channel = conn.createChannel();//同一时刻服务器只会发一条消息给消费者channel.basicQos(1);// 创建队列// 队列名称,是否持久化(队列),是否排他,是否自动删除,其他参数channel.queueDeclare("test4072", true, false, false, null);for (int i = 0; i < 50; i++) {// 定义发送信息String msg = "hello rabbitmq-kwh"+i;// 发送数据// MessageProperties.PERSISTENT_TEXT_PLAIN:持久化消息channel.basicPublish("", "test4072", MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());Thread.sleep(1000);}System.out.println("发送成功....");// 关闭资源channel.close();conn.close();} catch (Exception e) {e.printStackTrace();}}
}
相关文章:
RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)
文章目录 十.RabbitMQ10.1 简单队列实现10.2 Work 模式(工作队列)10.3 公平分发10.4 RabbitMQ 消息应答与消息持久化消息应答概念配置 消息持久化概念配置 十.RabbitMQ 10.1 简单队列实现 简单队列通常指的是一个基本的消息队列,它可以用于…...
【VScode】第三方GPT编程工具-CodeMoss安装教程
一、CodeMoss是什么? CodeMoss是一款集编程、学习和办公于一体的高效工具。它兼容多种主流平台,包括VSCode、IDER、Chrome插件、Web和APP等,支持插件安装,尤其在VSCode和IDER上的表现尤为出色。无论你是编程新手还是资深开发者&a…...
在JavaScript中,let 和 const有什么不同
在JavaScript中,let 和 const 是用于声明变量的关键字,但它们有一些重要的区别 1.重新赋值: let 声明的变量可以重新赋值。const 声明的变量必须在声明时初始化,并且之后不能重新赋值 let a 10; a 20; // 有效,a 的…...
Mysq学习-Mysql查询(4)
5.子查询 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL4.1开始引入.在SELECT子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表. 子查询中常用的操作符有ANY(SOME),ALL,IN,EXISTS.子查询可以添加到SELECT,UPD…...
安装torch-geometric库
目录 1.查看 torch 和 CUDA 版本 2.依次下载和 torch 和 CUDA 对应版本的四个依赖库pyg-lib、torch-scatter、torch-sparse、torch-cluster以及torch-spline-conv 3.下载并安装torch-geometric库 1.查看 torch 和 CUDA 版本 查看CUDA版本 nvcc -V 查看pytorch版本 pip s…...
Java数组深入解析:定义、操作、常见问题与高频练习
一、数组的定义 1. 什么是数组 数组是一个容器,用来存储多个相同类型的数据。它属于引用数据类型,可以存储基本数据类型(如int、char)或者引用数据类型(如String、对象)。 2. 数组的定义方式 a. 动态初…...
Docker-构建自己的Web-Linux系统-镜像webtop:ubuntu-kde
介绍 安装自己的linux-server,可以作为学习使用,web方式访问,基于ubuntu构建开源项目 https://github.com/linuxserver/docker-webtop安装 docker run -d -p 1336:3000 -e PASSWORD123456 --name webtop lscr.io/linuxserver/webtop:ubuntu-kde登录 …...
【C语言练习(17)—输出杨辉三角形】
C语言练习(17) 文章目录 C语言练习(17)前言题目题目解析整体代码 前言 杨辉三角形的输出可以分三步,第一步构建一个三角形、第二步根据规律将三角形内容填写、第三步将三角形以等腰的形式输出 题目 请输出一个十行的…...
SpringMVC学习(二)——RESTful API、拦截器、异常处理、数据类型转换
一、RESTful (一)RESTful概述 RESTful是一种软件架构风格,用于设计网络应用程序。REST是“Representational State Transfer”的缩写,中文意思是“表现层状态转移”。它基于客户端-服务器模型和无状态操作,以及使用HTTP请求来处理数据。RES…...
React 第二十节 useRef 用途使用技巧注意事项详解
简述 useRef 用于操作不需要在视图上渲染的属性数据,用于访问真实的DOM节点,或者React组件的实例对象,允许直接操作DOM元素或者是组件; 写法 const inpRef useRef(params)参数: useRef(params),接收的 …...
VIVO Java开发面试题及参考答案
TCP 能不能两次握手? TCP 不能两次握手。 在 TCP 连接建立过程中,三次握手是必不可少的。第一次握手是客户端向服务器发送一个带有 SYN(同步序列号)标志的 TCP 报文段,这个报文段包含了客户端初始的序列号。这一步的主要目的是告诉服务器,客户端想要建立连接,并且让服务…...
C# Winfrom chart图 实例练习
代码太多了我就不展示了,贴一些比较有代表性的 成品效果展示: Excel转Chart示例 简单说一下我的思路 \ 先把Excel数据展示在dataGridView控件上 XLIST 为 X轴的数据 XLIST 为 Y轴的数据 ZLIST 为 展示的数据进行数据处理点击展示即可 // 将Excel数…...
iOS从Matter的设备认证证书中获取VID和PID
设备认证证书也叫 DAC, 相当于每个已经认证的设备的标识。包含了 VID 和 PID. VID: Vendor ID ,标识厂商 PID: Product ID, 标识设备的 根据 Matter 对于设备证书的规定,DAC证书subject应该包含VID 和 PID. 可通过解析 X509 证书读取subject…...
带着国标充电器出国怎么办? 适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern) 适配器模式适配器模式(Adapter Pattern)概述talk is cheap, show you my code总结 适配器模式 适配器模式(Adapter Pattern)是面向对象软件设计中的一种结构型设计…...
破解海外业务困局:新加坡服务器托管与跨境组网策略
在当今全球化商业蓬勃发展的浪潮之下,众多企业将目光投向海外市场,力求拓展业务版图、抢占发展先机。而新加坡,凭借其卓越的地理位置、强劲的经济发展态势以及高度国际化的营商环境,已然成为企业海外布局的热门之选。此时…...
Mybatis-Plus快速入门
参考:黑马MyBatisPlus教程全套视频教程,快速精通mybatisplus框架 1.Mapper-plus配置 1.MapperScan("Mapper目录的位置") 2.Mapper层文件需要继承BaseMapper extends BaseMapper<实体类> 3.开启日志 4.配置类 Configuration public cl…...
Chrome被360导航篡改了怎么改回来?
一、Chrome被360导航篡改了怎么改回来? 查看是否被360主页锁定,地址栏输入chrome://version,看命令行end后面(蓝色部分),是否有https://hao.360.com/?srclm&lsn31c42a959f 修改步骤 第一步:…...
Coding(Jenkinsfile)+ Docker 自动化部署 Springboot —— 图文细节和一些注意事项说明
前言:本章讲述一下我使用Coding(Jenkinsfile) Docker部署Springboot项目过程,记录图文细节和一些需要注意的问题。 说明:为什么要使用Coding去集成Docker? 节约了服务器内存,不需要单独部署 Jen…...
docker django uwsgi 报错记录
这个配置中是能够正常进行网页访问的,能够查看网页 [uwsgi] chdir /home/luichun/lc/Pyfile/PyCursor/app module app.wsgi:application plugin-dir /usr/lib/uwsgi/plugins plugins python311 env TZAsia/Shanghai socket-timeout 60 websocket-ma…...
数据分析思维(五):分析方法——假设检验分析方法
数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python,更重要的是数据分析思维。没有数据分析思维和业务知识,就算拿到一堆数据,也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》,本文内容就是提取…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
2025.6.9总结(利与弊)
凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...
