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

RabbitMq学习(第一天)

文章目录

  • 1、mq(消息队列)概述
  • 2、RabbitMQ环境搭建
  • 3、java基于AMQP协议操作RabbitMQ
  • 4、基于Spring AMQP操作RabbitMQ
  • 5、代码中创建队列与交换机
    • ①、配置类创建
    • ②、基于@RabbitListener注解创建
  • 6、RabbitMQ详解
    • ①、work模型
    • ②、交换机
      • 1、Fanout(广播)交换机
      • 2、Direct(定向)交换机
      • 3、Topic(话题)交换机
  • 7、消息转换器
  • 总结

1、mq(消息队列)概述

MQ 是 Message Queue(消息队列)的简称,是一种用于异步通信和解耦的中间件技术。它的核心功能是通过队列结构存储和传输消息,允许生产者(发送消息的一方)和消费者(接收消息的一方)在不同时间进行数据交换,而无需直接连接

MQ作用:

①、异步调用:

异步调用方式其实就是基于消息通知的方式,一般包含三个角色:

  • 消息发送者:投递消息的人,就是原来的调用方
  • 消息代理:管理、管理存储、转发消息的中间件
  • 消息接收者:接收和处理消息的人,就是原来的服务提供方

在这里插入图片描述

优点

  • 异步调用,无需等待,性能好
  • 故障隔离,下游服务故障不影响上游业务

缺点

  • 不能立即得到调用结果,时效性差
  • 确定下游业务执行是否成功
  • 业务安全依赖于Broker的可靠性

②、削峰/降流
在电子商务一些秒杀、促销活动中,合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。如下图所示:
在这里插入图片描述

③、降低系统耦合性

对于发送方来说,只需要将自己的消息发送到消息队列就ok了,而对于接收方来说,只需要接收消息即可,而无需关注谁发的,极大降低了发送接收方的耦合性。

④、顺序保证

消息队列保证数据按照特定的顺序被处理,适用于那些对数据顺序有严格要求的场景。大部分消息队列,例如 RocketMQ、RabbitMQ、Pulsar、Kafka,都支持顺序消息。

⑤、延时/定时处理
消息发送后不会立即被消费,而是指定一个时间,到时间后再消费。大部分消息队列,例如 RocketMQ、RabbitMQ、Pulsar、Kafka,都支持定时/延时消息。

⑥、即时通讯

MQTT(消息队列遥测传输协议)是一种轻量级的通讯协议,采用发布/订阅模式,非常适合于物联网(IoT)等需要在低带宽、高延迟或不可靠网络环境下工作的应用。它支持即时消息传递,即使在网络条件较差的情况下也能保持通信的稳定性。RabbitMQ 内置了 MQTT 插件用于实现 MQTT 功能(默认不启用,需要手动开启)

四大mq产品对比:

在这里插入图片描述

2、RabbitMQ环境搭建

我们在docker环境下通过docker pull来快速获取RabbitMQ的镜像。

拉取:

docker pull rabbitmq:3.8-management

运行:

docker run -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=123456 -v mq-plugins:/plugins  --name mq --hostname mq -p 15672:15672 -p 5672:5672 -d rabbitmq:3.8-management

其中,15672端口是图形化界面的端口,而5672是发送接收消息的端口。

在这里插入图片描述

登录之后,界面如下:

在这里插入图片描述

  • publisher: 消息发送者

  • consumer: 消息的消费者

  • queue: 队列,存储消息

  • exchange: 交换机,负责路由消息

  • connectors: 生产者或者消费者和消息队列建立连接的情况

  • channels: 消息通道,生产者消费者进行通信需要建立一个通道。

  • Admin: 管理虚拟主机,添加和查看已有的用户

RabbitMQ架构:
在这里插入图片描述

3、java基于AMQP协议操作RabbitMQ

AMQP(Advanced Message Queuing Protocol),是用于在应用程序之间传递消息的开放标准协议。协议以语言和平台无关,更符合互联网的要求。

官网文档教程:
java中操作RabbitMQ

新建java的maven项目,添加依赖:

	<dependencies><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.9.0</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.17</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>2.0.17</version></dependency></dependencies>

这几个依赖必须导入。

发送方(Send.java) :

public class Send {private final static String QUEUE_NAME = "hello";public static void main(String[] args) {ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.138.133");factory.setPort(5672);factory.setUsername("root");factory.setPassword("123456");// 建立连接,创建管道try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare(QUEUE_NAME, false, false, false, null);String message = "Hello RabbitMQ!";channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));System.out.println(" [x] Sent '" + message + "'");} catch (Exception e) {throw new RuntimeException(e);}}}

接收方(Recv.java) :

public class Recv {private final static String QUEUE_NAME = "hello";public static void main(String[] args) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.138.133");factory.setPort(5672);factory.setUsername("root");factory.setPassword("123456");// 建立连接,创建管道Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME, false, false, false, null);System.out.println(" [*] Waiting for messages. To exit press CTRL+C");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), StandardCharsets.UTF_8);System.out.println(" [x] Received '" + message + "'");};channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });}
}

host和用户、密码等依据自己情况修改
先运行Recv,此时接收方会处于等待接收的状态,随后Send发送消息,接收成功。
运行结果:

 [x] Sent 'Hello RabbitMQ!'[x] Received 'Hello RabbitMQ!'

4、基于Spring AMQP操作RabbitMQ

Spring AMQP是基于AMQP协议定义的一套API规范,提供了模板来发送和接收消息。包含两部分,其中spring-amqp是基础抽象,spring-rabbit是底层的默认实现。因此RabbitMQ中我们可以通过Spring进行操作。

	<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--AMQP依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><!--单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies>

消息发送者

	@Resourceprivate RabbitTemplate rabbitTemplate;@Testpublic void testSend() {// 队列名称String queueName = "hello";// 消息String message = "hello RabbitMQ!";// 发送消息rabbitTemplate.convertAndSend(queueName, message);}

消息消费者(其实就是通过监听队列来获取信息):
@RabbitListener()中的queues参数里面的值就是队列的名字。

@Slf4j
@Component
public class Consumer {@RabbitListener(queues = {"hello"}) //这里参数是队列的名字,填写的时候按自己情况来。public void testConsumer(String msg) {log.info("消费者收到消息:" + msg);}}

如果想要在代码中创建队列的话,可以在config类中定义:

@Configuration
public class MQConfig {//代表创建一个叫queue的队列@Beanpublic Queue queue() {return new Queue("queue");}
}

5、代码中创建队列与交换机

①、配置类创建

@Configuration
public class MQConfig {// 声明交换机@Beanpublic FanoutExchange fanoutExchange() {return new FanoutExchange("test.fanout");}// 声明队列1@Beanpublic Queue fanoutQueue1() {return new Queue("fanout.queue1");}// 声明队列2@Beanpublic Queue fanoutQueue2() {return new Queue("fanout.queue2");}// 绑定队列1与交换机@Beanpublic Binding bindingQueue1(Queue fanoutQueue1, FanoutExchange fanoutExchange) {return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);}// 绑定队列2与交换机@Beanpublic Binding bindingQueue2(Queue fanoutQueue2, FanoutExchange fanoutExchange) {return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);}
}

如上就是通过在一个config类中定义bean实现注入。

②、基于@RabbitListener注解创建

@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "direct.queue1"),exchange = @Exchange(name = "test.direct", type = ExchangeTypes.DIRECT),key = {"red", "blue"}
))

该注解用配置类等价于:

@Configuration
public class MQConfig {// 声明交换机@Beanpublic DirectExchange fanoutExchange() {return new DirectExchange("test.direct");}// 声明队列1@Beanpublic Queue fanoutQueue1() {return new Queue("direct.queue1");}// 绑定队列1与交换机@Beanpublic Binding bindingQueue1(Queue fanoutQueue1, DirectExchange directExchange) {return BindingBuilder.bind(fanoutQueue1).to(directExchange).with("red");}@Beanpublic Binding bindingQueue2(Queue fanoutQueue1, DirectExchange directExchange) {return BindingBuilder.bind(fanoutQueue1).to(directExchange).with("blue");}
}

可以说极大简化了开发。

6、RabbitMQ详解

①、work模型

work模型就是多个消费者绑定到一个队列,加快消息处理速度,通过设置prefech来控制消费者领取消息的数量。
而prefetch默认值为250,这个可以自己来控制调整。

发送方代码:

	@Testpublic void testWorkQueue() throws Exception {String queueName = "work.queue";for (int i = 0; i < 50; i++) {String message = "hello, worker, message_" + i;rabbitTemplate.convertAndSend(queueName, message);Thread.sleep(50);}}

接收方代码:

    @RabbitListener(queues = {"work.queue"}) //这里参数是队列的名字,填写的时候按自己情况来。public void workConsumer(String msg) throws InterruptedException {System.out.println("work.queue队列1收到消息:" + msg);Thread.sleep(20);}@RabbitListener(queues = {"work.queue"}) //这里参数是队列的名字,填写的时候按自己情况来。public void workConsumer2(String msg) throws InterruptedException {System.err.println("work.queue队列2收到消息:" + msg);Thread.sleep(200);}

最后发现两个接收方无论处理快还是慢,最后每个都只能处理25个消息,而我们一共发了50条消息,这样会导致处理效率很低。
在这里插入图片描述
解决方法,在properties中加一个配置:

spring:listener:simple:prefetch: 1

运行结果:
在这里插入图片描述
这样处理的话,效率就高多了,基本就是发一条消息,谁有空谁来处理即可。

②、交换机

1、Fanout(广播)交换机

Fanout交换机会将接收到的消息广播到每一个与其绑定的queue,也叫广播模式。

在这里插入图片描述

这里我们在队列中声名两个queue,分别叫fanout.queue1和fanout.queue2。
交换机使用amq.fanout,为fanout类型
在这里插入图片描述
在这里插入图片描述

记得先将交换机与队列进行绑定:

在这里插入图片描述

接收方代码:

    @RabbitListener(queues = {"fanout.queue1"}) //这里参数是队列的名字,填写的时候按自己情况来。public void fanoutConsumer(String msg) throws InterruptedException {System.out.println("fanout.queue队列1收到消息:" + msg);}@RabbitListener(queues = {"fanout.queue2"}) //这里参数是队列的名字,填写的时候按自己情况来。public void fanoutConsumer2(String msg) throws InterruptedException {System.err.println("fanout.queue队列2收到消息:" + msg);}

发送方代码:

    @Testpublic void testFanoutQueue() throws Exception {String exchange = "amq.fanout";String message = "hello, everyone";rabbitTemplate.convertAndSend(exchange, "", message);}

运行结果:

fanout.queue队列2收到消息:hello, everyone
fanout.queue队列1收到消息:hello, everyone

2、Direct(定向)交换机

Direct Exchange 会将接收到的消息根据规则路由到指定的Queue,因此称为定向路由。
每一个Queue都与Exchange设置一个BindingKey,发布者发送消息时,指定消息的RoutingKey,Exchange将消息路由到BindingKey与消息RoutingKey一致的队列

在这里插入图片描述
当交换机中的key对应的值和queue中的bingdingKey值相同时,消息就发送到对应的消费者手中,同时不同queue的bingdingKey值可以是相同的,同一个bindingKey可以有多个值。

创建两个direct.queue:
在这里插入图片描述
绑定到amq.direct上:
在这里插入图片描述
接收消息代码:

 @RabbitListener(queues = {"direct.queue1"}) //这里参数是队列的名字,填写的时候按自己情况来。public void DirectConsumer(String msg) throws InterruptedException {System.out.println("fanout.queue队列1收到消息:" + msg);}@RabbitListener(queues = {"direct.queue2"}) //这里参数是队列的名字,填写的时候按自己情况来。public void DirectConsumer2(String msg) throws InterruptedException {System.err.println("fanout.queue队列2收到消息:" + msg);}

发送消息代码:

    @Testpublic void testDirectQueue() throws Exception {String exchange = "amq.direct";String message1 = "hello, Red";String message2 = "hello, Blue";String message3 = "hello, Yellow";rabbitTemplate.convertAndSend(exchange, "red", message1);rabbitTemplate.convertAndSend(exchange, "blue", message2);rabbitTemplate.convertAndSend(exchange, "yellow", message3);}

运行结果:

direct.queue队列1收到消息:hello, Red
direct.queue队列1收到消息:hello, Blue
direct.queue队列2收到消息:hello, Red
direct.queue队列2收到消息:hello, Yellow

3、Topic(话题)交换机

TopicExchange与DirectExchange类似,区别在于routingKey可以是多个单词的列表,并且以“.”分割。

Queue与Exchange指定BindingKey时可以使用通配符:

#: 代指0个或多个单词
*: 代指一个单词

在这里插入图片描述
新建两个队列:
在这里插入图片描述
使用amq.topic绑定:
在这里插入图片描述

接收方代码:

    @RabbitListener(queues = {"topic.queue1"}) //这里参数是队列的名字,填写的时候按自己情况来。public void TopicConsumer(String msg) throws InterruptedException {System.out.println("topic.queue队列1收到消息:" + msg);}@RabbitListener(queues = {"topic.queue2"}) //这里参数是队列的名字,填写的时候按自己情况来。public void TopicConsumer2(String msg) throws InterruptedException {System.err.println("topic.queue队列2收到消息:" + msg);}

发送方代码:

    @Testpublic void testTopicQueue() throws Exception {String exchange = "amq.topic";String message = "Japan's news";String message2 = "China's news";String message3 = "China's weather";String message4 = "Japan's weather";rabbitTemplate.convertAndSend(exchange, "Japan.news", message);rabbitTemplate.convertAndSend(exchange, "China.news", message2);rabbitTemplate.convertAndSend(exchange, "China.weather", message3);rabbitTemplate.convertAndSend(exchange, "Japan.weather", message4);}

运行结果:

topic.queue队列2收到消息:Japan's news
topic.queue队列2收到消息:China's news
topic.queue队列1收到消息:China's news
topic.queue队列1收到消息:China's weather

7、消息转换器

发送java对象代码:

    @Testpublic void testSendObject() {Map<String, Object> msg = new HashMap<>();msg.put("name", "jack");msg.put("age", 18);rabbitTemplate.convertAndSend("object.queue", msg);}

接收消息为乱码:

在这里插入图片描述
解决方法:
我们引入消息转换器,使用json来处理消息。

引入对应依赖:

        <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>

接收方和消费方都配置消息转换器:

import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;@Configuration
public class messageConfig {@Beanpublic MessageConverter messageConverter() {return new Jackson2JsonMessageConverter();}
}

在这里插入图片描述

总结

重要点:

  1. 搭建环境,熟悉RabbitMQ面板与配置
  2. 使用SpringBoot集成开发配置
  3. 重点学会@RabbitListener的使用
  4. 熟悉常见交换机和队列
  5. 配置使用消息转换器

相关文章:

RabbitMq学习(第一天)

文章目录 1、mq(消息队列)概述2、RabbitMQ环境搭建3、java基于AMQP协议操作RabbitMQ4、基于Spring AMQP操作RabbitMQ5、代码中创建队列与交换机①、配置类创建②、基于RabbitListener注解创建 6、RabbitMQ详解①、work模型②、交换机1、Fanout(广播)交换机2、Direct(定向)交换机…...

基于RK3568多功能车载定位导航智能信息终端

基于安卓系统开发集成5G和4G模块&#xff0c;GPS/BD双模定位模块&#xff08;高精度差分惯导&#xff09;、WIFI模块&#xff0c;蓝 牙模块&#xff0c;RFID模块&#xff0c;音频播放&#xff0c;视频信号输入&#xff08;AHD或CVBS&#xff09;模块等多功能车载定位导航智能信…...

Facebook的元宇宙新次元:社交互动如何改变?

科技的浪潮正将我们推向一个全新的时代——元宇宙时代。Facebook&#xff0c;这个全球最大的社交网络平台&#xff0c;已经宣布将公司名称更改为 Meta&#xff0c;全面拥抱元宇宙概念。那么&#xff0c;元宇宙究竟是什么&#xff1f;它将如何改变我们的社交互动方式呢&#xff…...

【上位机——MFC】对话框

对话框的使用 1.添加对话框资源 2.定义一个自己的对话框类(CMyDlg)&#xff0c;管理对话框资源&#xff0c;派生自CDialog或CDialogEx均可 对话框架构 #include <afxwin.h> #include "resource.h"class CMyDlg :public CDialog {DECLARE_MESSAGE_MAP() publi…...

【信息系统项目管理师】法律法规与标准规范——历年考题(2024年-2020年)

手机端浏览☞【信息系统项目管理师】法律法规与标准规范——历年考题&#xff08;2024年-2020年&#xff09; 2024年上半年综合知识【占比分值3′】 42、关于招标投标的描述&#xff0c;不正确的是&#xff08;属于同一集团组织成员的投标人可以按照该组织要求协同投标&#xf…...

【HarmonyOS 5】鸿蒙Web组件和内嵌网页双向通信DEMO示例

【HarmonyOS 5】鸿蒙Web组件和内嵌网页双向通信DEMO示例 一、前言 在 ArkUI 开发中,Web 组件(Web)允许开发者在应用内嵌入网页,实现混合开发场景。 本文将通过完整 DEMO,详解如何通过WebviewController实现 ArkUI 与内嵌网页的双向通信,涵盖 ArkUI 调用网页 JS、网页调…...

var、let、const的区别

1. var 在ES5中&#xff0c;顶层对象的属性和全局变量是等价的&#xff0c;用var声明的变量即是全局变量&#xff0c;也是顶层变量&#xff0c;在浏览器中顶层对象指的是window对象&#xff0c;在node中顶层对象指的是global对象。 console.log(a) // undefined var a 1 cons…...

计算机视觉注意力机制【一】常用注意力机制整理

在做目标检测项目&#xff0c;尤其是基于 YOLOv5 或 YOLOv7 的改进实验时&#xff0c;我发现不同注意力机制对模型性能的提升确实有明显影响&#xff0c;比如提高小目标检测能力、增强特征表达等。但每次找代码都得翻论文、找 GitHub&#xff0c;效率很低。所以我干脆把常见的注…...

交替序列长度的最大值

1、题目描述 给出n个正整数&#xff0c;你可以随意从中挑选一些数字组成 一段序列S&#xff0c;该序列满足以下两个条件&#xff1a; 1.奇偶交替排列&#xff1a;例如&#xff1a;"奇&#xff0c;偶&#xff0c;奇&#xff0c;偶&#xff0c;奇.…" 或者 "偶&a…...

追踪大型语言模型的思想(下)(来自针对Claude的分析)

多步推理 正如我们上面所讨论的&#xff0c;语言模型回答复杂问题的一种方式就是简单地记住答案。例如&#xff0c;如果问“达拉斯所在州的首府是哪里&#xff1f;”&#xff0c;一个“机械”的模型可以直接学会输出“奥斯汀”&#xff0c;而无需知道德克萨斯州&#xff0c;达拉…...

嵌入式通信协议总览篇:万物互联的基石

嵌入式系统的世界,是靠协议“说话”的世界。 在你设计一个智能设备、构建一个工业控制系统、开发一款 IoT 网关时,一个核心问题始终绕不开:**这些设备之间如何“对话”?**答案就是——通信协议。 本篇作为系列第一章,将带你全面理解嵌入式通信协议的全貌,为后续深入学习…...

Android 连接德佟打印机全实例+踩坑

文章目录 1. sdk下载2. 开始开发2.1 打印之前准备工作2.2 打印机是否连接检测2.3 打印框架设计 最近有个需求是要连接 德佟打印机 进行打印相关事宜, 现在就遇到的问题简单阐述一下。 1. sdk下载 我们首先需要在官网下载对应的SDK&#xff0c;地址为&#xff1a;https://www.d…...

TikTok 矩阵运营新手实操保姆级教程 2.0 版本

在当下这个全球化的数字浪潮中&#xff0c;TikTok 这片充满机遇的流量蓝海&#xff0c;正吸引着无数创业者和品牌方争相角逐。而要想在这激烈的竞争中脱颖而出&#xff0c;TikTok 矩阵运营无疑是至关重要的制胜法宝。今天&#xff0c;就给大家送上这份超实用的新手实操教程&…...

WordPress:Locoy.php火车头采集

<?php /* 模块参数列表&#xff1a; post_title 必选 标题 post_content 必选 内容 tag 可选 标签 post_category 可选 分类 post_date 可选 时间 post_excerpt 可选 摘要 post_author 可选 作者 category_description 可选 分类信息 post_cate_meta[name] 可选 自定义分…...

C++ 有哪些标准版本

目录 1.主要分为以下几个版本C98&#xff08;ISO/IEC 14882:1998&#xff09; 第一个国际标准C03&#xff08;ISO/IEC 14882:2003&#xff09;小幅度修订C11&#xff08;ISO/IEC 14882:2011&#xff09;一次重大更新C14&#xff08;ISO/IEC 14882:2014&#xff09;增量改进C17&…...

二、MySQL操作命令汇总

文章目录 二、MySQL操作命令汇总1.数据库操作2.表的增删改查2.1 查表2.2 建表给表添加注释假如表已经存在 2.3 删表2.4 查看表结构2.5 改表 3.简单查询3.1 查询单个字段3.2 查询多个字段3.3 查询所有字段3.4 查询结果去重3.5 查询结果排序3.6 查询结果限制条数3.7 查询分组结果…...

编程日志4.28

队列的链表表示代码 #include<iostream> #include<stdexcept> using namespace std; //队列 类的声明 template<typename T>//1.模板声明&#xff0c;表明Queue类是一个通用的模板类&#xff0c;可以用于存储任何类型的元素T class Queue {//2.Queue类的声…...

Qt 中信号与槽(signal-slot)机制支持 多种连接方式(ConnectionType)

Qt 中信号与槽&#xff08;signal-slot&#xff09;机制支持 多种连接方式&#xff08;ConnectionType&#xff09; Qt 中信号与槽&#xff08;signal-slot&#xff09;机制支持 多种连接方式&#xff08;ConnectionType&#xff09;&#xff0c;用于控制信号发出后如何调用槽…...

Python案例实战《手势识别》

目录 1、效果图2、手势识别关键步骤&#xff08;1&#xff09; 导入必要的库&#xff08;2&#xff09;配置 MediaPipe&#xff08;3&#xff09;启动摄像头&#xff08;4&#xff09;设置手指张开判断的距离阈值&#xff08;5&#xff09;计算手指之间的欧几里得距离&#xff…...

NGINX `ngx_http_charset_module` 字符集声明与编码转换

一、模块定位与功能 ngx_http_charset_module 主要提供两大能力&#xff1a; 响应头声明&#xff1a;在 Content-Type 头部自动添加 ; charsetXXX&#xff0c;告知客户端所用字符集。单向编码转换&#xff1a;在 NGINX 层将一种单字节编码&#xff08;如 koi8-r、windows-125…...

进程与线程详细介绍

目录 一 进程概念 二 进程的组成 2.1 PCB 2.2 数据段 2.3 程序段 三 进程的五大特点 四 进程的创建与销毁 五 线程概念 六 线程特征 七 进程与线程的区别与联系 区别 联系 一 进程概念 进程是程序的一次执行过程&#xff0c;是操作系统进行资源分配和调度的基本单位…...

JAVA中ArrayList的解析

gogogo出发喽&#xff01;让我们来认识一下它吧 什么是ArrayList Java 中的 ArrayList 是 Java 集合框架中的重要类&#xff0c;用于实现动态数组 动态数组&#xff1a;可按需自动扩展或缩小&#xff0c;无需手动管理数组大小。比如不断向 ArrayList 添加元素时&#xff0c;…...

【LLM+Code】Devin PromptTools详细解读

Devin 官网&#xff1a;https://devin.ai/ Prompt 大部分篇幅都是tools的直出的description和parameters的一些信息 其他的包含 Communicatework的一些指导Best PracticesInformation HandlingData SecurityResponse Limitationsplanthink You are Devin, a software engi…...

AI应用开发实战分享

一、前言 30年前的IntelWindows互相绑定&#xff0c;让世界被计算机技术重构了一次&#xff0c;有了程序员这个工种。十几年前iPhone、Android前后脚发布&#xff0c;智能手机和移动App互相绑定&#xff0c;引爆了一个长达十几年的移动互联网大跃进时代。而随着人工智能大模型…...

浅聊find_package命令的搜索模式(Search Modes)

背景 find_package应该算是我们使用最多的cmake命令了。但是它是如何找到上游库的.cmake文件的&#xff1f; 根据官方文档&#xff0c;整理下find_package涉及到的搜索模式。 搜索模式 find_package涉及到的搜索模式有两种&#xff1a;模块模式(Module mode)和配置模式(Conf…...

FPGA图像处理(二)-----彩色图像灰度化

由于fpga实现除法相对复杂&#xff0c;故将除法变为乘法再移位。因此每种方法对图像输入数据均分3步进行&#xff0c;极其有效信号打三拍处理。 timescale 1ns / 1ps // // Description: 彩色图像灰度化 // module image_rgb2gray(input wire clk ,input wir…...

Ultralytics中的YOLODataset和BaseDataset

YOLODataset 和 BaseDataset 是 Ultralytics YOLO 框架中用于加载和处理数据集的两个关键类。 YOLODataset类&#xff08;ultralytics/data/dataset.py&#xff09;继承于 BaseDataset类&#xff08;ultralytics/data/base.py&#xff09; BaseDataset() BaseDataset 是一个…...

Mac 使用 Charles代理生成https服务

在Mac电脑上使用Charles软件通过代理生成HTTPS服务&#xff0c;让手机访问电脑的开发地址&#xff0c;可按以下步骤操作&#xff1a; 一、Charles软件设置 安装与启动Charles&#xff1a;从Charles官网下载并安装Charles软件&#xff0c;之后启动它。开启代理服务 点击菜单栏…...

【PostgreSQL】数据库主从库备份与高可用部署

文章目录 一、架构设计原理二、部署清单示例2.1 StatefulSet配置片段2.2 Service配置三、配置详解3.1 主节点postgresql.conf3.2 从节点配置四、初始化流程4.1 创建复制用户4.2 配置pg_hba.conf五、故障转移示例5.1 自动切换脚本5.2 手动提升从节点六、监控与维护6.1 关键监控指…...

ERP进销存系统源码,SaaS模式多租户ERP管理系统,SpringBoot、Vue、UniAPP技术框架

SaaS ERP管理系统源码&#xff0c;覆盖了整个生产企业所有部门的管理&#xff1a;采购、销售、仓库、生产、财务、质量、OA&#xff1a; ERP源码技术架构&#xff1a;SpringBootVueElementUIUniAPP ERP系统功能清单&#xff1a; 流程处理中心&#xff1a;待审批任务、已审批任…...

Decode rpc invocation failed: null -> DecodeableRpcInvocation

DecodeableRpcInvocation 异常情况解决方法 错误警告官方FAQ 异常情况 记录一下Dubbo调用异常 java.util.concurrent.ExecutionException: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2025-05-07 22:09:5…...

VAE和Stable Diffusion的关系

文章目录 ✅ 简单回顾&#xff1a;什么是 VAE&#xff1f;&#x1f504; Stable Diffusion 和 VAE 的关系&#xff1a;&#x1f3af; 编码器&#xff1a;&#x1f4a5; 解码器&#xff1a; &#x1f914; 那 Stable Diffusion 本身是 VAE 吗&#xff1f;&#x1f9e0; 简要对比…...

stable Diffusion模型结构

详细描述一下stable Diffusion的推理过程 其实很简单 prompt先经过textencoder tokenizer&#xff0c;embedding 随机生成噪声图片 通过vae encode压缩成潜空间大小 unet with cross attn 去噪 并融合文本信息 # 上面两个信息如何混合 cross-attention sd模型中各种不同的采样器…...

Milvus(16):索引解释

索引是建立在数据之上的附加结构。其内部结构取决于所使用的近似近邻搜索算法。索引可以加快搜索速度&#xff0c;但在搜索过程中会产生额外的预处理时间、空间和 RAM。此外&#xff0c;使用索引通常会降低召回率&#xff08;虽然影响可以忽略不计&#xff0c;但仍然很重要&…...

数字化转型-4A架构之应用架构

系列文章 数字化转型-4A架构&#xff08;业务架构、应用架构、数据架构、技术架构&#xff09;数字化转型-4A架构之业务架构 前言 应用架构AA&#xff08;Application Architecture&#xff09;是规划支撑业务的核心系统与功能模块&#xff0c;实现端到端协同。 一、什么是应…...

中间件-RocketMQ

RocketMQ 基本架构消息模型消费者消费消息模式顺序消息机制延迟消息批量消息事务消息消息重试最佳实践 基本架构 nameServer: 维护broker列表信息&#xff0c;客户端连接时只需要连接nameServer。可配置成集群。 broker&#xff1a;broker分为master和slave&#xff0c;master负…...

AI开发playwright tool提示词

[TASK] 生成一个isModuleElementObject function&#xff0c;若element的qa-test class在对象moduleObj {"qa-test-mycourses-course": "qa-test-mycourses-course-title", "qa-test-discussion-module": "qa-test-discussion-description&…...

《Origin画百图》之带显著性标记的多因子分组柱状图

带显著性标记的多因子分组柱状图 需要数据&#xff1a; 组1&#xff08;大类&#xff09; 组2&#xff08;小类&#xff09; Y数据 Y误差 选中Y数据和Y误差两列数据&#xff0c; 点击绘图--分组图--多因子分组柱状图 数据列就是上一步选择的Y和Y误差&#xff0c; 点击子组…...

邮件发送频率如何设置?尊重文化差异是关键!

一、不同文化背景&#xff0c;邮件频率大不同 1.工作习惯不一样 一些西方国家&#xff0c;美国和欧洲工作时间和个人时间分得很清楚。工作日的上午 9 点到下午 5 点&#xff0c;这期间发邮件&#xff0c;收件人大概率会看也会回。但是在深夜或者周末发邮件容易让收件人觉得你…...

Python 识别图片上标点位置

Python识别图片上标点位置 要识别图片上的标点位置&#xff0c;可以使用Python中的OpenCV库。以下是几种常见的方法&#xff1a; 方法一&#xff1a;使用颜色阈值识别 import cv2 import numpy as np# 读取图片 image cv2.imread(image.jpg)# 转换为HSV颜色空间 hsv cv2.c…...

JDK Version Manager (JVMS)

以下是使用 JDK Version Manager (JVMS) 工具在Windows系统中安装JDK的详细步骤及注意事项&#xff0c;结合多篇搜索结果整理而成&#xff1a; --- 一、安装前准备 1. 下载JVMS - 访问 [GitHub Releases页面](https://github.com/ystyle/jvms/releases) 或镜像地址&#x…...

办公学习 效率提升 超级PDF处理软件 转换批量 本地处理

各位办公小能手们&#xff01;我跟你们说啊&#xff0c;有个软件叫超级PDF&#xff0c;那可真是PDF文件处理界的全能选手&#xff0c;专门解决咱们办公、学习时文档管理的各种难题。接下来我给大家好好唠唠它的厉害之处。 先说说它的核心功能。第一是格式转换&#xff0c;这软件…...

阿里云服务器-centos部署定时同步数据库数据-dbswitch

前言&#xff1a; 本文章介绍通过dbswitch工具实现2个mysql数据库之间实现自动同步数据。 应用场景&#xff1a;公司要求实现正式环境数据库数据自动冷备 dbswitch依赖环境&#xff1a;git ,maven,jdk 方式一&#xff1a; 不需要在服务器中安装git和maven&#xff0c;直接用…...

C++函数栈帧详解

函数栈帧的创建和销毁 在不同的编译器下&#xff0c;函数调用过程中栈帧的创建是略有差异的&#xff0c;具体取决于编译器的实现&#xff01; 且需要注意的是&#xff0c;越高级的编译器越不容易观察到函数栈帧的内部的实现&#xff1b; 关于函数栈帧的维护这里我们要重点介…...

Wireshark抓账号密码

训练内容&#xff1a; 1. 安装Ethereal或者Wireshark&#xff0c;熟悉网络嗅探器的使用方法&#xff1b; 2. 实现浏览器与IIS服务器的ssl安全访问&#xff1b; 3. 利用网络嗅探器截获浏览器访问IIS服务器之间数据包&#xff0c;包括有ssl安全连接&#xff08;https方式&am…...

【hot100】bug指南记录1

之前学了一阵C&#xff0c;还是更熟悉C的语法呀&#xff0c;转Java还有点不适应........ 这个系列纯纯记录自己刷题犯的愚蠢的错误......hhhh&#xff0c;我是人&#xff0c;one 愚蠢的码人...... 巩固巩固基础好吗&#xff1f;&#xff01;编程菜鸟.......hhh&#xff0c;又…...

物联网从HomeAssistant开始

文章目录 一、在树梅派5上安装home-assistant二、接入米家1.对比下趋势2.手动安装插件3.配置方式 三、接入公牛1.手动安装插件2.配置方式 一、在树梅派5上安装home-assistant https://www.home-assistant.io/installation/ https://github.com/home-assistant/operating-syste…...

2025年渗透测试面试题总结-网络安全、Web安全、渗透测试笔试总结(一)(附回答)(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 网络安全、Web安全、渗透测试笔试总结(一) 1.什么是 WebShell? 2.什么是网络钓鱼&#xff1f; 3.你获取网络…...

C++ set和map系列(关联式容器)的介绍及使用

欢迎来到干货小仓库 "一个好汉三个帮&#xff0c;程序员同样如此" 1.关联式容器 STL中的容器分为两类&#xff0c;序列式容器和关联式容器。 序列式容器&#xff1a;例如STL库中的vector、list和deque、forward_list(C11)等&#xff0c;这些容器统称为序列式容器&…...

C#与Halcon联合编程

一、加载图片 导入并初始化 using HalconDotNet; ho_Image new HObject();需要在引用中导入 halcondotnet.dll 关联句柄 打开新窗口 //创建一个句柄变量 绑定winform 窗口 HTuple winfowFater this.pictureBox1.Handle; //打开新的窗口 HOperatorSet.SetWindowAttr(&qu…...