【RabbitMQ】队列模型
1.概述
RabbitMQ作为消息队列,有6种队列模型,分别在不同的场景进行使用,分别是Hello World,Work queues,Publish/Subscribe,Routing,Topics,RPC。
下面就分别对几个模型进行讲述。
2.Hello World
这个模型也叫直连模型,从这个名字来看就知道它的原理很简单,是一个线性的且没有分支的模型。
生产者生产消息,把消息给队列,队列在把消息给消费者进行消费。
代码实现
工具类
public class RabbitMQUtils {public static Connection getConnection() throws IOException, TimeoutException {//创建一个连接工厂ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.153.132");//设置rabbitmq的主机地址factory.setPort(5672);//设置rabbitmq的端口号factory.setUsername("admin");//设置用户名factory.setPassword("admin");//设置密码factory.setVirtualHost("/abc");//设置虚拟主机//根据连接工厂获取一个连接对象Connection connection = factory.newConnection();return connection;}
}
生产者
/*** 基于HelloWorld消息模型的消息生产者*/
public class MessageProvider1 {public static void main(String[] args) throws IOException, TimeoutException {Connection connection= RabbitMQUtils.getConnection();//根据连接对象创建一个Channel(信道)Channel channel = connection.createChannel();/*** 根据Channel声明一个队列* 参数1:队列的名称* 参数2:描述队列是否持久化(true 讲队列以文件的形式保存在硬盘上,下一次启动mq服务还可以看到该队列)* 参数3:是否独占队列(true 只有当前会话才能使用该队列)* 参数4:队列是否会自动删除* 参数5:对队列进行的额外设置*/channel.queueDeclare("hello", true, false, false, null);/*** 发布消息* 参数1:交换机的名称* 参数2:队列的名称* 参数3:消息进行额外设置 MessageProperties.PERSISTENT_TEXT_PLAIN消息持久化* 参数4:消息主体,以字节数组的方式进行消息的发送*/channel.basicPublish("","hello", MessageProperties.PERSISTENT_TEXT_PLAIN,"hello rabbitmq".getBytes());//关闭资源channel.close();connection.close();}
}
消费者部分
/*** 基于HelloWorld消息模型的消息消费者*/
public class MessageConsumer1 {public static void main(String[] args) throws IOException, TimeoutException {Connection connection= RabbitMQUtils.getConnection();Channel channel = connection.createChannel();//声明一个队列channel.queueDeclare("hello", true, false, false, null);/*** 消息的消费* 参数1:队列的名称* 参数2:是否开启自动确认机制 true 开启* 参数3:处理队列里面消息的回调函数*/channel.basicConsume("hello",true,new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {String msg = new String(body);System.out.println(msg);}});}
}
这时候先启动消费者等待生产者的消息,然后再开启生产者,那么消费者就会接收到消息,这里是”Hello rabbit“
这里的队列名称要自己再RabbitMQ的管理界面进行创建
在这个界面可以进行手动创建
3.Work queues
它与第一种模型不同的是,消息队列不再是单一的讲消息传送给一个消费者,而是可以传送给多个消费者。它就解决了生产者生产消息的速率大于消费者消费消息的速率,使消息不断地堆积在队列中。
同样的它的模型也很简单,也是生产消息给队列,队列再将消息分给队列。
代码实现
生产者
/*** 消息的生产者 -- 工作队列实现*/
public class MessageProvider2 {public static void main(String[] args) throws Exception {Connection connection = RabbitMQUtils.getConnection();// 创建信道Channel channel = connection.createChannel();// 声明队列channel.queueDeclare("work", false, false, false, null);// 发送消息for (int i = 1; i <= 10; i++) {String message = "hello,SpringCloud" + i;channel.basicPublish("", "work", null, message.getBytes());}// 关闭资源channel.close();connection.close();}
}
消费者
public class MessageConsumer_q2 {public static void main(String[] args) throws Exception {Connection connection = RabbitMQUtils.getConnection();final Channel channel = connection.createChannel();//声明队列channel.queueDeclare("work",false,false,false,null);//消费消息 参数2 false 关闭消息的自动确认机制channel.basicConsume("work",true,new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("消息是:" + new String(body));}});}
}
消费者的代码都一样的,就不重复写了。
但现在要思考一个问题,就是我这里的代码是开启了消息的自动确认机制,就是意思是队列会将消息按照顺序平均分配给消费者,也就是消费者会先再队列中确认消息(确认意味着消息从队列中删除),这样就会出现一个问题,有的消费者消费得快,有得消费者消费得慢,这样得结果显然不是我们想要的,我们肯定希望能者多劳,也就是按需分配,而不是按量平均分配 。还有一个问题,就是消费者一下子确认这么多消息然后慢慢消费,万一某个消费者在消费的时候挂掉了,这些消息都已经不在队列中了,那不就直接导致消息丢失了。
因此我们需要对消息进行手动确认而不是自动确认
public class MessageConsumer_q1 {public static void main(String[] args) throws Exception {Connection connection = RabbitMQUtils.getConnection();final Channel channel = connection.createChannel();//声明队列channel.queueDeclare("work", false, false, false, null);//消费消息 第二个参数改成false,即关闭自动确认channel.basicConsume("work", false, new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {// 开启手动确认 不再同时确认多条消息channel.basicAck(envelope.getDeliveryTag(), false);System.out.println("消息是:" + new String(body));}});}
}
4.fanout
这个模型就相对复杂点,多了一个交换机。
广播类型的交换机可以和任意类型的队列进行配对。
每个消费者有自己的队列。
每个队列都要绑定到交换机.
生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定。
交换机把消息发送给绑定过的所有队列 队列的消费者都能拿到消息。
实现一条消息被多个消费者消费
代码实现
生产者
public class MessageProvider3 {public static void main(String[] args) throws IOException, TimeoutException {Connection connection = RabbitMQUtils.getConnection();Channel channel = connection.createChannel();/*** 声明交换机* 参数1:交换机的名称* 参数2:交换机的类型 fanout广播类型的交换机(可以和任何队列进行绑定)*/channel.exchangeDeclare("exchange_fanout","fanout");/*** 发布消息* 参数1:交换机的名称* 参数2;路由key 由于是广播类型的交换机,所以不用定义路由key* 参数3:对消息进行的额外设置* 参数4:消息主体*/channel.basicPublish("exchange_fanout","",null,"hello rabbitmq".getBytes());}
}
消费者
public class MessageConsumer3 {public static void main(String[] args) throws Exception {Connection connection = RabbitMQUtils.getConnection();Channel channel = connection.createChannel();//声明交换机channel.exchangeDeclare("exchange_fanout", "fanout");//声明队列channel.queueDeclare("q1", false, false, false, null);//将交换机和队列进行绑定 参数1: 队列的名称 参数2: 交换机的名称 参数3: 路由keychannel.queueBind("q1", "exchange_fanout", "");//消费消息channel.basicConsume("q1", true, new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println(new String(body));}});}
}
一条消息会被所有消费者消费
5.Direct
在前面的模型中,一条消息被所有的消费者消费,但是在某些特定的场景下,我们希望不同的消息被不同的队列消费
生产者向交换机发送消息时,会指定一个routing key
交换机在接收到消息时会根据这个key来对它绑定的队列的routing key进行匹配,匹配的才会发送过去。
代码实现
生产者
/*** 消息的生产者 -- direct消息模型*/
public class MessageProvider {public static void main(String[] args) throws Exception {// 获取与RabbitMQ的连接Connection connection = RabbitMQUtils.getConnection();// 创建信道Channel channel = connection.createChannel();// 声明交换机,名称为exchange_direct,类型为directchannel.exchangeDeclare("exchange_direct", "direct");// 发布消息,发送到exchange_direct交换机,routingKey为add,消息内容为"hello, this is direct message"channel.basicPublish("exchange_direct", "add", null, "hello, this is direct message".getBytes());// 关闭信道channel.close();// 关闭连接connection.close();}
}
消费者1
/*** 消息的消费者1 -- direct类型*/
public class ConsumerProvider_1 {public static void main(String[] args) throws Exception {// 获取与RabbitMQ的连接Connection connection = RabbitMQUtils.getConnection();// 创建信道Channel channel = connection.createChannel();// 声明交换机,名称为exchange_direct,类型为directchannel.exchangeDeclare("exchange_direct", "direct");// 声明队列,名称为queue_directchannel.queueDeclare("queue_direct", false, false, false, null);// 使用routingKey绑定队列和交换机,分别绑定add、update的routingKeychannel.queueBind("queue_direct", "exchange_direct", "add");channel.queueBind("queue_direct", "exchange_direct", "update");// 消费消息,设置为自动确认channel.basicConsume("queue_direct", true, new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {// 打印接收到的消息内容System.out.println(new String(body));}});}
}
消费者2
/*** 消息的消费者2 -- direct类型*/
public class ConsumerProvider_2 {public static void main(String[] args) throws Exception {// 获取与RabbitMQ的连接Connection connection = RabbitMQUtils.getConnection();// 创建信道Channel channel = connection.createChannel();// 声明交换机,名称为exchange_direct,类型为directchannel.exchangeDeclare("exchange_direct", "direct");// 声明队列,名称为queue_direct1channel.queueDeclare("queue_direct1", false, false, false, null);// 使用routingKey绑定队列和交换机,分别绑定update、delete的routingKeychannel.queueBind("queue_direct1", "exchange_direct", "update");channel.queueBind("queue_direct1", "exchange_direct", "delete");// 消费消息,设置为自动确认channel.basicConsume("queue_direct1", true, new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {// 打印接收到的消息内容System.out.println(new String(body));}});}
}
消费者1的队列与交换机绑定的routing key分别是 add、update
消费者2的队列与交换机绑定的routing key分别是update、delete
示例代码中的生产者生产的消息的routing key是add,那么只有消费者1能接收到消息。
6.Topics
这个模型与Direct的原理是一样的,差异就在于它的routing key是有模糊匹配的机制。
但是它的routing key一般是由多个单词拼在一起,中间由”.“进行隔开,例如item.insert
这里的通配符有两种
分别是*和#
*可以匹配一个单词
#可以匹配一个或多个单词
代码演示
生产者
public class MessageProvider5 {public static void main(String[] args) throws Exception {Connection connection = RabbitMQUtils.getConnection();Channel channel = connection.createChannel();//声明topic类型的交换机channel.exchangeDeclare("topic_exchange", "topic");//发布消息channel.basicPublish("topic_exchange","user.product.add",null,"hello,this is topic message".getBytes());//关闭资源channel.close();connection.close();}
}
消费者1
public class MessageConsumer5_1 {public static void main(String[] args) throws Exception {Connection connection = RabbitMQUtils.getConnection();Channel channel = connection.createChannel();//声明交换机channel.exchangeDeclare("topic_exchange", "topic");//声明队列channel.queueDeclare("topic_q1", false, false, false, null);//将队列和交换机进行绑定channel.queueBind("topic_q1", "topic_exchange", "user.*");//消费消息channel.basicConsume("topic_q1", true, new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println(new String(body));}});}
}
消费者2
public class MessageConsumer5_2 {public static void main(String[] args) throws Exception {Connection connection = RabbitMQUtils.getConnection();Channel channel = connection.createChannel();//声明交换机channel.exchangeDeclare("topic_exchange", "topic");//声明队列channel.queueDeclare("topic_q2", false, false, false, null);//将队列和交换机进行绑定channel.queueBind("topic_q2", "topic_exchange", "user.#");//消费消息channel.basicConsume("topic_q2", true, new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println(new String(body));}});}
}
7.RPC(了解)
- 客户端:
- 与 RabbitMQ 建立连接并创建信道。
- 声明一个用于接收响应的回调队列。
- 生成一个唯一的
correlationId
,用于匹配请求和响应。 - 发送请求消息到 RPC 队列,同时设置
replyTo
为回调队列名称,correlationId
为生成的唯一标识。 - 从回调队列接收响应消息,并根据
correlationId
进行匹配。
- 服务端:
- 与 RabbitMQ 建立连接并创建信道。
- 声明 RPC 队列。
- 从 RPC 队列接收请求消息。
- 处理请求消息,生成响应结果。
- 将响应消息发送到
replyTo
指定的回调队列,并带上相同的correlationId
。
相关文章:
【RabbitMQ】队列模型
1.概述 RabbitMQ作为消息队列,有6种队列模型,分别在不同的场景进行使用,分别是Hello World,Work queues,Publish/Subscribe,Routing,Topics,RPC。 下面就分别对几个模型进行讲述。…...
【Java设计模式】第3章 软件设计七大原则
3-1 本章导航 学习开辟原则(基础原则)依赖倒置原则单一职责原则接口隔离原则迪米特法则(最少知道原则)里氏替换原则合成复用原则(组合复用原则)核心思想: 设计原则需结合实际场景平衡,避免过度设计。设计模式中可能部分遵循原则,需灵活取舍。3-2 开闭原则讲解 定义 软…...
Axure中继器(Repeater): 列表展示
文章目录 引言I 中继器说明中继器的作用中继器的结构中继器例子II 中继器基础应用:列表展示表头制作列表内容表头中的列与中继器的列绑定填充数据内容引言 中继器是Axure RP 7.0推出的新功能,用于快速设计一些复杂的交互界面(制作“高保真”的动态原型)。 I 中继器说明 中…...
mybatis的第五天学习笔记
12. 动态SQL 12.1 动态SQL概述 新增内容: 动态SQL执行流程 MyBatis如何解析动态SQLSQL语句构建过程参数绑定机制 新增示例 // 动态条件查询接口示例 List<User> searchUsers(Param("name") String name,Param("age") Integer age,Para…...
LeetCode 941 有效的山脉数组
算法探索:如何精准判断有效山脉数组 在计算机科学领域,算法和数据结构堪称基石,它们不仅是解决复杂问题的有力工具,更是衡量程序员技术水平的重要指标。数组作为最基础、应用最广泛的数据结构之一,围绕它衍生出了大量…...
java设计模式-单例模式
单例模式 1、饿汉式(静态常量) Slf4j public class SingletonTest01 {public static void main(String[] args) {Singleton singleton Singleton.getInstance();Singleton singleton2 Singleton.getInstance();log.info("比对结果:{}",singletonsingl…...
对抗Prompt工程:构建AI安全护栏的攻防实践
大语言模型的开放性与自然语言交互特性使其面临前所未有的Prompt工程攻击威胁。本文通过分析2021-2023年间157个真实越狱案例,揭示语义混淆、上下文劫持、多模态组合三重攻击路径的技术原理,提出融合动态意图拓扑分析(DITA)、对抗…...
CentOS 环境下 MySQL 数据库全部备份的操作指南
最近阿里云个人服务到期,因为是很久之前买的测试机器,配置较低,上面运行的有技术博客 和以往的测试项目,所以准备放弃掉。 需要备份下上面的表结构和数据、以及代码仓库。 下面是一个完整的 CentOS 环境下 MySQL 数据库全部备份…...
回溯算法补充leetcode
1. 组合 leetcode题目链接:77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示…...
利用 AI 实现雷池 WAF 自动化运维
欢迎加入雷池社区:雷池 WAF | 下一代 Web 应用防火墙 | 免费使用 已经升级到 8.4.0 的兄弟们应该会发现雷池又多了一些 AI 能力,8.4.0 更新公告。 感谢 Web2GPT 为雷池提供的 AI 能力支持。 主要变化 右下角多了一个 AI 小助手 按钮右上角多了一个 连…...
【嵌入式面试】
1、如果中断函数中有耗时较长的内容,会导致以下问题,如何解决? 对系统实时性的影响 阻塞低优先级中断:中断函数执行时间过长,会阻塞其他低优先级中断的响应。例如,如果一个高优先级中断处理程序中包含耗时…...
【Hadoop入门】Hadoop生态之HDFS
1 HDFS核心设计原理 HDFS(Hadoop Distributed File System)是专为大规模数据存储设计的分布式文件系统,其核心设计基于以下原则: 数据分块与分布式存储: 分块机制:文件被切分为固定大小的数据块(…...
试剂SYBR 14核酸染料在染色时的操作步骤(说明)
化学试剂的基本内容||试剂参数 ---中文名:SYBR 14核酸染料 ---英文名:SYBR 14 Nucleic Acid Stain ---浓度:通常以5mM的DMSO储存液形式提供。 ---吸收波长:488nm ---发射波长:518nm ---出厂商:西安强…...
Spring Boot 国际化配置项详解
Spring Boot 国际化配置项详解 1. 核心配置项分类 将配置项分为以下类别,便于快速定位: 1.1 消息源配置(MessageSource 相关) 控制属性文件的加载、编码、缓存等行为。 配置项作用默认值示例说明spring.messages.basename指定属…...
Python之禅:深入理解Python设计哲学
Python之禅(The Zen of Python)是Python语言的核心设计哲学,由Python创始人Guido van Rossum和Tim Peters共同制定。理解Python之禅不仅能帮助我们写出更"Pythonic"的代码,还能深入把握Python语言的设计理念。 Python之禅的由来 Python之禅最…...
Rancher 全面介绍
目录 Rancher 全面介绍1. **Rancher 的定义与核心功能**2. **Rancher 的应用场景**3. **Rancher 的生态系统**4. **Rancher 的优势**5. **总结** Rancher 全面介绍 1. Rancher 的定义与核心功能 Rancher 是一个开源的企业级多集群 Kubernetes 管理平台,旨在简化容…...
Docker常用命令
镜像命令 搜索镜像 docker search nginx 拉取镜像 docker pull nginx,默认拉取最新镜像 docker pull nginx:1.25.3,拉取指定版本 查看镜像 docker images 删除镜像 docker rmi nginx:1.25.3 docker rmi -f $(docker images -aq),删除全…...
项目中如何防止超卖
什么是超卖?假如只剩下一个库存,却被多个订单买到了,简单理解就是库存不够了还能正常下单。 方案1:数据库行级锁 1. 实体类 Data TableName("product") public class Product {TableId(type IdType.AUTO)private Lon…...
龙虎榜——20250408
行情如下 根据2025年4月8日的龙虎榜的行业分析如下: 一、农业种植与乡村振兴 • 政策催化:推进种业自主创新、农机装备升级等目标,叠加中美关税反制逻辑。 • 市场表现: • 农业种植:种子类企业因国产替代预期受资…...
快速上手Vue3国际化 (i18n)
文章目录 一、背景介绍二、页面效果三、使用步骤四、代码1.src/App.vue2.src/main.js3.src/locales/index.js4.src/views/login/_request.js5.src/locales/en.json6.src/locales/zh.json7.SystemParam.vue8.I18NController.java9.DataServiceConfigValue.java10.ConfigValue.ja…...
Mistral OCR:重新定义文档理解的下一代 OCR 技术
引言 在数字化时代,文档处理和理解是企业、科研机构以及个人工作流程中的重要环节。然而,传统的光学字符识别(OCR)技术往往难以应对复杂文档中的多语言、多模态内容。近日,法国 AI 明星创企 Mistral AI 推出了一款名为 Mistral OCR 的光学字符识别 API,以其卓越的性能和…...
前端面试核心知识点整理:从 JavaScript 到 Vue 全解析
一、JavaScript 异步编程核心:Promise 与 async/await 1. Promise 深度解析 定义:Promise 是处理异步操作的对象,代表一个异步操作的最终状态(成功 / 失败)。三种状态: pending(进行中):初始状态,异步操作未完成。fulfilled(已成功):异步操作成功,调用 resolve …...
npm fund 命令的作用
运行别人的项目遇到这个问题: npm fund 命令的作用 npm fund 是 npm 提供的命令,用于显示项目依赖中哪些包需要资金支持。这些信息来自包的 package.json 中定义的 funding 字段,目的是帮助开发者了解如何支持开源维护者。 典型场景示例 假…...
LeetCode344反转字符串
思路: 交换即可 void reverseString(char* s, int sSize) {int jsSize-1;for(int i0;i<sSize/2;i){int tmps[i];s[i]s[j];s[j]tmp;j--;} }...
[Python] 企业内部应用接入钉钉登录,端内免登录+浏览器授权登录
[Python] 为企业网站应用接入钉钉鉴权,实现钉钉客户端内自动免登授权,浏览器中手动钉钉授权登录两种逻辑。 操作步骤 企业内部获得 开发者权限,没有的话先申请。 访问 钉钉开放平台-应用开发 创建一个 企业内部应用-钉钉应用。 打开应用…...
设计模式-单例设计模式
目录 什么是单例设计模式? 为什么要使用单例模式? 资源方面 数据一致方面 系统性能方面 代码维护方面 如何设计单例类? 在说模式之前,我们需要先知道怎么设计才可以让一个类只能有一个实例化对象呢? 饿汉模式…...
Nextjs15 实战 - React Notes CURD 实现
本专栏内容均可在Github:notes_04 找到 完整项目使用技术栈: Nextjs15 MySQL Redis Auth Prisma i18n strapi Docker vercel 一、本节目标 本篇我们来实现右侧笔记CURD部分。 一、效果 当点击 New 按钮的时候进入编辑界面: 当点击…...
【KWDB 创作者计划】架构设计与AIoT场景实践
产品定位与核心价值主张 架构设计与技术实现 分布式架构设计 多模存储引擎实现 云边端协同机制 核心技术创新解析 就地计算技术 自适应时序引擎 混合事务处理 性能优化技术体系 高效存储机制 查询加速策略 资源管理与隔离 行业解决方案与典型应用 工业物联网平台…...
DeepSeek底层揭秘——《推理时Scaling方法》技术对比浅析
4月初,DeepSeek 提交到 arXiv 上的最新论文正在 AI 社区逐渐升温。 笔者尝试对比了“关于推理时Scaling”与现有技术,粗浅分析如下: 与LoRA的对比 区别: 应用场景:LoRA是一种参数高效微调方法,主要用于在…...
Spring MVC与Spring Boot文件上传配置差异对比及文件上传关键类详细说明与对比
一、Spring MVC与Spring Boot文件上传配置差异对比 1. 配置方式差异 框架配置方式依赖管理自动配置Spring MVC需手动配置MultipartResolver(如StandardServletMultipartResolver)需自行引入commons-fileupload等依赖无,默认不启用文件上传支…...
Linux网络配置与测试
目录 一.与网络配置相关的命令 1.1ifconfig命令 1.1.1作用 1.1.2网络接口的信息 接口信息的组成 1.1.3显示所有网卡包括没有启动的网卡 1.1.4查看指定网络接口 1.1.5开启或关闭网卡 1.1.6设置临时虚拟网卡 1.1.7网络通讯情况 编辑 1.1.8临时修改网卡属性 1.2hos…...
游戏赛季和数据处理
问题 游戏从无赛季到赛季机制会涉及哪些问题: 如何改动,增加赛季机制,涉及要修改的代码量最少如何改动,账号、角色部分数据继承问题,涉及要修改的代码量最少账号下角色的永久服共享或是永久服独立,需要做…...
京东店铺托管7*16小时全时护航
内容概要 京东店铺托管服务的*716小时全时护航模式,相当于给商家配了个全年无休的"运营管家"。专业团队每天从早7点到晚11点实时盯着运营数据和商品排名,连半夜流量波动都能通过智能系统秒级预警。这种全天候服务可不是单纯拼人力——系统自动…...
HTTP的Keep-Alive是什么?TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗?
HTTP的Keep-Alive: HTTP Keep-Alive 是一种机制,允许客户端和服务器在单个 TCP 连接 上发送多个 HTTP 请求 和 响应,而不是每次请求和响应后都关闭连接。它的主要目的是提高性能,减少连接的开销,优化通信效率。 工作…...
使用scoop一键下载jdk和实现版本切换
安装 在 PowerShell 中输入下面内容,保证允许本地脚本的执行: set-executionpolicy remotesigned -scope currentuser然后执行下面的命令安装 Scoop: iwr -useb get.scoop.sh | iex国内用户可以使用镜像源安装:powershell iwr -us…...
PPIO × UI-TARS:用自然语言操控电脑,AI Agent 的极致体验
Manus的爆火预示着AI 正在从单纯的文本生成和图像识别迈向更复杂的交互场景。字节跳动近期推出的开源项目 UI-TARS Desktop 为我们展示了一种全新的可能性:能够通过自然语言理解和处理来控制计算机界面。这款工具代表了人工智能与人机交互领域的重大突破,…...
PG:incorrect prev-link
目录 WAL日志中"incorrect prev-link"错误解决方案错误原因分析解决步骤典型修复案例 WAL日志中"incorrect prev-link"错误解决方案 错误原因分析 WAL日志的prev-link字段用于确保日志记录的连续性。当出现incorrect prev-link 2/754ECB0 at 2/8000028错…...
SQL Server 数据库邮件配置失败:SMTP 连接与权限问题
问题现象: 配置数据库邮件时,发送测试邮件失败,提示 “邮件无法发送到 SMTP 服务器,操作超时”(错误 14661)或 “服务器拒绝发件人地址”(错误 15009)。 快速诊断 检查数据库邮件配置…...
深入浅出动态规划:从基础到蓝桥杯实战(Java版)
引言:为什么你需要掌握动态规划? 动态规划(DP)是算法竞赛和面试中的常客,不仅能大幅提升解题效率(时间复杂度通常为O(n)或O(n))[4],更是解决复杂优化问题的利器。统计显示ÿ…...
获取cookie的chrome插件:Get cookies.txt LOCALLY
接上一篇,在下载视频的时候需要网站的cookie,下面介绍一款可以获取网站cookie的chrome插件 https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc?utm_sourceitem-share-cb 备注需要科学上网 【使用方…...
opencv无法设置禁用RGB转换问题
树莓派连接摄像头,摄像头输出格式为YUYV(YUV422)。 通过执行 v4l2-ctl --list-formats --device/dev/video0 可以看的具体的摄像头的数据格式。 使用opencv获取视频流,通过cap.set(cv2.CAP_PROP_CONVERT_RGB, 0)设置禁用自动转换RGB格式,但是打印输出…...
Ansible:roles角色
文章目录 Roles角色Ansible Roles目录编排Roles各目录作用创建 roleplaybook调用角色调用角色方法1:调用角色方法2:调用角色方法3: roles 中 tags 使用实战案例 Roles角色 角色是ansible自1.2版本引入的新特性,用于层次性、结构化…...
SAP系统采购信息记录失效
问题:采购信息记录失效 现象:最初主数据导入完成之后,单元测试的时采购信息记录是有效的,中间经过配置的变化,集成测试初期发现采购信息记录全部失效。 原因: 单元测试时发现采购订单里面的条件类型…...
JavaWeb 课堂笔记 —— 04 Ajax
本系列为笔者学习JavaWeb的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)》,章节分布参考视频教程,为同样学习…...
Pandas 库
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够…...
4.8学习总结
完成摆动序列的算法题(比较难,想不出方法) 学习了HashMap,TreeMap 的源码(看完一遍对其理解没有太清楚,还需再多刷几遍理解源码及其底层逻辑的概念) 学习了可变参数和Collections工具类...
C语言之九九乘法表
一、代码展示 二、运行结果 三、代码分析 首先->是外层循环是小于等于9的 然后->是内层循环是小于等于外层循环的 最后->就是\n让九九乘法表的格式更加美观(当然 电脑不同 有可能%2d 也有可能%3d) 四、与以下素数题目逻辑相似 五、运行结果...
【Linux操作系统】:信号
Linux操作系统下的信号 一、引言 首先我们可以简单理解一下信号的概念,信号,顾名思义,就是我们操作系统发送给进程的消息。举个简单的例子,我们在写C/C程序的时候,当执行a / 0类似的操作的时候,程序直接就挂…...
skynet.call使用详解
目录 skynet.call 详细解析1. 函数签名与参数2. 内部实现机制3. 会话ID与协程调度4. 超时与错误处理5. 返回值处理6. 协议类型的影响7. skynet.call vs skynet.send8. 示例代码分析9. 最佳实践10. 总结 skynet.call 详细解析 1. 函数签名与参数 函数签名: skynet…...
uniapp 打包 H5 向 打包的APP 使用 @dcloudio/uni-webview-js 传值
1.安装 dcloudio/uni-webview-js npm install dcloudio/uni-webview-js -save 这个模块的 uni. 会与H5的uniapp的 uni. 冲突,所以需要改下名称,一共需要改3处 2.引入并使用 import uniWeb from dcloudio/uni-webview-js;uniWeb.postMessage({data: {action: message,content…...